[英]NIO: How to avoid socketChannel.read(buffer) if no data available in buffer
我想编写一个NIO Server \\ Client应用程序,仅当Channel中的数据可用时,我才希望Server读取其中的socketChannel。 在我的用于测试目的的演示应用程序中,客户端仅连接到服务器,但从未将请求发送到服务器,但是我发现selectionKey.isReadable()始终返回true。 我希望因为客户端从不发送请求, 所以isReadalble()应该返回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应用程序,仅当Channel中的数据可用时,我才希望Server读取其中的socketChannel。
那就是Selector
和OP_READ
目的。
在我的演示应用程序用于测试目的的客户只需连接到服务器,但从未将请求发送给服务器,但我发现,
selectionKey.isReadable()
总是返回true。
因此,它是可读的。
我希望因为客户端从不发送请求,所以
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()
在自己的协议。 如果您不希望有空格,请不要发送。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.