【发布时间】:2020-06-12 17:33:14
【问题描述】:
我正在使用一个函数从非阻塞 SocketChannel(来自 accept() 的套接字)和阻塞 SocketChannel(客户端)读取字节。我正在使用选择器来实现一个服务器来处理多个客户端,并且我正在使用环回地址来仅使用我的笔记本电脑。这是我写的
while((r = socketChannel.read(ackBuf)) != -1) {
System.out.println(name3d+" r: "+r);
}
并且我预计当到达频道中内容的末尾时, read() 将返回 -1 但不是成功的。 read(),在非阻塞配置中,如果目前没有准备好读取,也返回 0,但很快就会(如果我理解得很好)所以如果我将代码更改为
while((r = socketChannel.read(ackBuf)) > 0) {
System.out.println(name3d+" r: "+r);
}
如果稍后会准备好,我也不会阅读任何内容。 我如何区分我得到 0 是因为没有准备好还是因为它结束了? 在下面的 sn-p 中,我可以在睡眠后第二次测试读取,但我确信这不是做我想做的事情的可靠方法。
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);
}
【问题讨论】:
标签: java sockets nio nonblocking socketchannel