2012-03-21 204 views
1

我想在客户端关闭套接字后关闭TCP连接监听线程(serverside).. 线程在readLine()中等待循环.. 我该怎么做?套接字关闭后关闭线程

while(isconnected){ 
String msg = in.readLine(); 
//.. 
} 

回答

1

也许扩展您的协议,以便客户端在关闭其套接字之前发送QUIT消息。

+4

但是如果客户端在发送QUIT之前崩溃会发生什么? – 2012-03-22 01:16:51

-1

您需要中断该线程。

+0

不起作用。它仍然会在readLine上等待。 – toto2 2012-03-21 23:28:49

+0

@ toto2 - 比这更糟,这个“解决方案”甚至没有意义。服务器端如何知道客户端已关闭套接字并且侦听线程需要中断? – 2012-03-22 01:16:07

3

你必须调用socket.close()方法,如果你正确使用它应该没问题。我不知道readLine()来自哪里,所以我将假设它的BufferedReader。如果你在文档中看这里BufferedReader readLine()

你会看到它抛出IOException如果有错误,并且如果它是流结束它将返回null。

所以你应该基本上做到这一点:

try{ 
    while(socket.isConnected()){ 
    String line = in.readLine(); 
    if(line==null){ 
     //END OF STREAM 
    } 
    } 
}catch(IOException e){ 
    //deal with IOException here 
} 

否则,我认为你现在做的是尽快另一端断开坐在一个紧凑的循环。如果你尝试在上面的代码中打印出msg,你会看到它打印出不间断的null。

+0

更具体地说,该IOException是一个SocketException。 – toto2 2012-03-21 23:36:18

+0

SocketException扩展IOException,但是如果您阅读文档BufferedReader中的readLine()抛出“IOException”不是SocketException。就个人而言,我认为它应该抛出EOFException,这更有意义。 – WalterM 2012-03-21 23:40:02

+0

我的意思是:当你调用'socket.close()'时,它会在'readLine()'的线程中抛出一个SocketException异常。 – toto2 2012-03-21 23:44:43

0

首先,您不能分辨客户端是否需要很长时间才能响应,或者是否已关闭。

你可以做的是设置一些超时时间,并在服务器中有一个线程在超时时间后调用clientSocket.close()。这将在接收线程中抛出一个SocketException。它将带你离开接收循环,如果接收循环后没有任何东西,线程将自行终止。

0

WalterM基本上是对的。 readLine调用将返回null流被远程客户端关闭,并且如果连接“断开”而没有正确关闭,或者低级套接字读取超时,则会抛出异常。

这是值得指出的是,它更简单,更高效的只是这样做:

try { 
    String msg; 
    while ((msg = in.readLine()) != null) { 
     // do stuff 
    } 
} catch (IOException ex) 
    // report error 
} finally { 
    // Close the socket under all circumstances to avoid potential 
    // resource leakage 
    try { 
     socket.close(); 
    } catch (IOException ex) { 
     // ignore 
    } 
} 

检查插座仍连接它是多余的。无论如何,低级套接字读取将会这样做。