2012-01-09 135 views
2

我在服务器端为每个连接都有一个线程。当客户端不发送命令时,服务器线程被阻塞:在让客户端知道的同时从服务器端关闭TCP连接

while ((commandHeader = fromNode.readLine()) != null) { 

,其对从TCP套接字获得的OutputStream内部调用的readLine()。 当我从另一个线程调用socket.close()时,这个调用会以SocketException唤醒,并且线程可以被终止。

但是,如果客户端比醒来并决定发出命令,它执行

stream.writeBytes("something\n"); 

其无限期阻塞。我知道这对于TCP来说可能很好(这只是一个半关闭)。 我应该在退出时向客户端发送一些内容,例如“QUIT \ n”;它也可以只读一个EOF。但是,如果在发送命令之前,我在客户端上调用readLine()或其他读取操作,则会在连接未关闭时阻止等待数据。 在尝试写入连接之前,客户端如何检测到连接已半封闭?

回答

2

首先我想你的应用程序逻辑应该是这样的,以避免半开TCP连接。您可以考虑在客户端添加定时器,以便如果没有收到它,它会再次开始轮询服务器。

从服务器的角度来看,另一种方法是在readLine上设置定时器。为readLine创建另一个方法,您可以在其中设置计时器,如果超过一定时间,只需将一些默认值返回给while循环。

编辑:

你可能想read this article专门的章节:什么挡在IO线程?

3

当socket.close()被调用服务器上底层的TCP连接关闭与典型FIN/FIN-ACK序列加上RST包,因此客户端会知道。当客户端调用stream.writeBytes()后,它应该失败。如果不是这意味着有一些丢失的数据包,并且连接最终会失败。

相关问题