gpt4 book ai didi

java - 如何测试非阻塞 channel 的 SocketChannel.read() 是否已完成?

转载 作者:太空宇宙 更新时间:2023-11-04 09:03:55 25 4
gpt4 key购买 nike

我正在使用一个函数从非阻塞SocketChannel(来自accept()的套接字)和阻塞SocketChannel(客户端)读取字节。我正在使用选择器来实现服务器来处理多个客户端,并且我使用环回地址仅使用我的笔记本电脑。我写了这个

while((r = socketChannel.read(ackBuf)) != -1) {
System.out.println(name3d+" r: "+r);
}

我预计当到达 channel 中的内容末尾时,read() 将返回 -1,但不会成功。read(),在非阻塞配置中,如果目前没有任何内容可供读取,但很快就会返回 0 (如果我理解得很好),所以如果我将代码更改为

while((r = socketChannel.read(ackBuf)) > 0) {
System.out.println(name3d+" r: "+r);
}

如果稍后有东西准备好,我也不会阅读任何内容。如何区分是因为未准备好还是因为结束而得到 0?在下面的代码片段中,我可以在 sleep 后第二次测试读取,但我确信这不是执行我想要的操作的可靠方法。

int times = 0;
while((r = socketChannel.read(ackBuf)) != -1 && times<2) {
if (r == 0)
try {
Thread.sleep(500);
times++;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name3d+" r: "+r);
}

最佳答案

“如果我因为未准备好或因为它已结束而得到 0?”您指的是消息还是通信的全部内容?

对于消息,您应该使用通信协议(protocol)(例如 json 或 http)进行通信,我认为您应该得到 SocketException...如果您使用阻塞并且另一端的人关闭了连接,您会得到...(我已经写信给很多人关于 SocketException 如何成为您的 friend )

--- 编辑 ---

查看 Channel 的文档,看起来如果/当 channel 关闭时,您应该得到某种 IOException(SocketException 是 IOException 的子类)

关于java - 如何测试非阻塞 channel 的 SocketChannel.read() 是否已完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60454664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com