Java 如何通过非阻塞socketchannel发送字符串

Java 如何通过非阻塞socketchannel发送字符串,java,socketchannel,Java,Socketchannel,我在客户机-服务器java应用程序中遇到SocketChannel问题 在服务器中,首先,我初始化选择器: Selector selector = null; try{ ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.socket().bind(new InetSocketAddress(5000)); serverSocketChannel

我在客户机-服务器java应用程序中遇到SocketChannel问题

在服务器中,首先,我初始化选择器:

Selector selector = null;
try{
    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
    serverSocketChannel.socket().bind(new InetSocketAddress(5000));
    serverSocketChannel.configureBlocking(false);

    selector = Selector.open();
    serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
} catch(IOException e){
    e.printStackTrace();
    return;
}
然后我开始了一段时间:

while(true) {
    try {
        selector.select();
    } catch (IOException ex) {
        ex.printStackTrace();
        break;
    }
    Set<SelectionKey> readyKeys = selector.selectedKeys();
    Iterator<SelectionKey> iterator = readyKeys.iterator();
    while (iterator.hasNext()) {
        SelectionKey key = iterator.next();
        iterator.remove();
        try {
            if (key.isAcceptable()) {
                ServerSocketChannel server = (ServerSocketChannel) key.channel();
                SocketChannel clientChannel = server.accept();
                clientChannel.configureBlocking(false);
                clientChannel.register(selector, SelectionKey.OP_READ);
            } else if (key.isReadable()) {
                readFunction((SocketChannel)key.channel())
        }
    }
}
while(true){
试一试{
selector.select();
}捕获(IOEX异常){
例如printStackTrace();
打破
}
设置readyKeys=selector.selectedKeys();
迭代器迭代器=readyKeys.Iterator();
while(iterator.hasNext()){
SelectionKey=iterator.next();
iterator.remove();
试一试{
if(key.isAcceptable()){
ServerSocketChannel server=(ServerSocketChannel)key.channel();
SocketChannel clientChannel=server.accept();
clientChannel.configureBlocking(false);
clientChannel.register(选择器,SelectionKey.OP_READ);
}else if(key.isReadable()){
readFunction((SocketChannel)key.channel())
}
}
}
现在我应该开发readFunction了,我想用一个字符串(Json)在客户机和服务器之间发送数据,但是由于它们没有阻塞,我不知道如果不在字符串之前发送字符串的大小,我是否可以这样做


有人能帮我吗?

将Json字符串转换为'ByteBuffer',并调用
SocketChannel。编写发送方法,让你试试这个?@TongChen问题是我事先不知道应该写多少次如果你的Json字符串长度是245,你的ByteBuffer容量是100,你需要发送三次。有一些工作需要客户端nd服务器要做的是,将字符串的三个部分合并为一个。我明白你的意思吗?是的,你说得对,但服务器不知道它必须接收245字节。事实上,我最初的问题是,在数据块开始和结束时,你需要一种与目标通信的方法之前,我是否可以发送字符串而不发送字符串大小。一选项是先发送大小。另一个选项是在末尾发送终止值。基本上,您需要一个服务器和客户端都能理解的协议。将Json字符串转换为“ByteBuffer”,然后调用
SocketChannel。编写
方法发送,您可以试试吗?@TongChen问题是我不知道如何事先将ny写我应该做什么假设你的Json字符串长度是245,你的ByteBuffer容量是100,你需要发送三次。客户端和服务器需要做一些工作,将字符串的三部分合并成一个。我明白你的意思吗?是的,你是对的,但服务器不知道它必须接收245字节。事实上,我最初的问题是如果我可以在不发送字符串大小的情况下发送字符串,那么当数据块开始和结束时,您需要一种与目标通信的方法。一种选择是先发送大小。另一种选择是在结束时发送终止值。基本上,您需要一个服务器和客户端都能理解的协议。