繁体   English   中英

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

[英]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。

那就是SelectorOP_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM