繁体   English   中英

是否保证连接ServerSocketChannel.accept()返回的SocketChannel?

[英]Is the SocketChannel returned by ServerSocketChannel.accept() guaranteed to be connected?

这是一个非常基本的问题,但我无法在任何地方找到明确的答案:

当我从ServerSocketChannel 接受()连接时,我保证返回的SocketChannel是“已连接 ”,或者可能发生返回的通道仍在执行某些形式的握手或其他任何情况,并且只会在以后设置其SelectionKey.OP_CONNECT位?

换句话说,我保证下面的代码永远不会打印false吗?

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(1234));
SocketChannel socketChannel = serverSocketChannel.accept();
System.out.println(socketChannel.isConnected());

据的源ServerSocketChannelImplServerSocketChannelImpl创建SocketChannelImpl与ST_CONNECTED的状态。

由于SocketChannelImpl.isConnected()方法检查ST_CONNECTED的状态,因此您的测试应始终返回true。

然而,这是美好时光的情景。 可能发生的是您的服务器线程被延迟,当您的线程调用isConnected() ,客户端已经关闭了连接。

所以,不,不能保证你的代码永远不会打印错误。

SocketChannel和底层套接字的状态是独立的,直到通过读/写操作同步。 调用accept()无法保证套接字仍处于打开状态。

所以基本上, SocketChannel.isConnected() 总是在调用accept()之后返回TRUE ,但这实际上是猜测 它真的不知道! 测试这个的唯一方法是尝试读取/写入一些数据到SocketChannel

将数据写入通道将显示套接字是否仍在远程计算机上打开。 您可以通过使用交换机连接客户端和服务器然后删除其中一台计算机的网络电缆来测试此行为。 您将看到插座如何在很长一段时间内保持打开状态。 有一些套接字选项可以用来缓解这个问题,但不是很多。

SocketChannel读取只会在read()返回-1时显示它已关闭;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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