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

时间:2016-06-27 16:46:56

标签: java nio socketchannel

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

当我accept()来自ServerSocketChannel的连接时,我保证返回的SocketChannel是" connected",或者可能发生返回的频道仍在执行某些形成握手或其他什么,只会在以后设置SelectionKey.OP_CONNECT位?

换句话说,我保证以下代码从不打印 var createdFile = await graphClient .Drives[driveId] .Items[folderId] .ItemWithPath(fileName) .Content .Request() .PutAsync<DriveItem>(stream);

false

2 个答案:

答案 0 :(得分:3)

根据Build Chain set up的来源ServerSocketChannelImpl创建一个状态为ST_CONNECTED的ServerSocketChannelImpl

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

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

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

答案 1 :(得分:0)

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

所以基本上,SocketChannel.isConnected() 始终会在调用accept()后返回 TRUE ,但这实际上是猜测。它真的不知道!测试此问题的唯一方法是尝试将一些数据读/写到SocketChannel

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

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