Java NIO:如果缓冲区中没有可用数据,如何避免socketChannel.read(缓冲区)

Java NIO:如果缓冲区中没有可用数据,如何避免socketChannel.read(缓冲区),java,nio,Java,Nio,我想编写一个NIO Server\Client应用程序,仅当通道中有可用数据时,我想让服务器读取socketChannel。在我的用于测试目的的演示应用程序中,客户端仅连接到服务器,但从未向服务器发送请求,但我发现selectionKey.isReadable()始终返回true。我预计,由于客户端从未发送请求,isReadable()应该返回false。 isReadable=true面临的问题是,我的应用程序试图从socketChannel读取数据,这是我真正想要避免的。 当套接字通道中有数

我想编写一个NIO Server\Client应用程序,仅当通道中有可用数据时,我想让服务器读取socketChannel。在我的用于测试目的的演示应用程序中,客户端仅连接到服务器,但从未向服务器发送请求,但我发现selectionKey.isReadable()始终返回true。我预计,由于客户端从未发送请求,isReadable()应该返回false。 isReadable=true面临的问题是,我的应用程序试图从socketChannel读取数据,这是我真正想要避免的。 当套接字通道中有数据要读取时,是否有任何方法可以通知我的服务器? 以下是我的服务器应用程序中的read()方法,其中isReadable()始终返回true:

private void read(SelectionKey selectionKey){    
    if(selectionKey.isReadable()){     
        SocketChannel socketChannel = (SocketChannel)selectionKey.channel();
        ByteBuffer buffer = ByteBuffer.allocate(256);
        try {
            socketChannel.read(buffer);
            String value = new String(buffer.array()).trim();
            System.out.println("Value is: " +value);
        } catch (IOException e) {
            System.out.println("Not able to read");
        }
    }
}
我想编写一个NIO Server\Client应用程序,仅当通道中有可用数据时,我想让服务器读取socketChannel

这就是
选择器
操作读取
的作用

在我的用于测试目的的演示应用程序中,客户端仅连接到服务器,但从未向服务器发送请求,但我发现
selectionKey.isReadable()
始终返回true

所以它是可读的

socketChannel.read(buffer);
String value = new String(buffer.array()).trim();
我希望,由于客户端从未发送请求
isReadable()
,所以应该返回false

错。如果对等方关闭了连接,它也会返回true。因此,如果没有数据且通道可读,则对等方必须关闭连接。您忽略了
read()
的返回值,因此您永远不会发现,也不会关闭频道,因此它仍然是可读的

socketChannel.read(buffer);
String value = new String(buffer.array()).trim();
这应该是:

int count = socketChannel.read(buffer);
if (count == -1)
{
    socketChannel.close();
    return;
}
String value = new String(buffer.array(), 0, buffer.limit());
应该不需要在您自己的协议上调用
trim()
。如果您不需要空间,请不要发送它们