【发布时间】:2012-03-21 23:18:01
【问题描述】:
我想在客户端关闭套接字后终止 TCP 连接侦听器线程(服务器端).. 线程在 readLine().. 中的循环中等待 我该怎么做?
while(isconnected){
String msg = in.readLine();
//..
}
【问题讨论】:
标签: java multithreading sockets tcp connection
我想在客户端关闭套接字后终止 TCP 连接侦听器线程(服务器端).. 线程在 readLine().. 中的循环中等待 我该怎么做?
while(isconnected){
String msg = in.readLine();
//..
}
【问题讨论】:
标签: java multithreading sockets tcp connection
你必须调用 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。
【讨论】:
socket.close() 时,它会在readLine() 的线程中抛出一个SocketException。
null 之后,您才会这样做。
也许扩展你的协议,以便客户端在关闭其套接字之前发送一个 QUIT 消息。
【讨论】:
首先,您无法判断客户端是否需要很长时间才能响应,或者它是否已关闭。
您可以做的是设置一些超时时间,并在服务器中设置一个线程,在超时后调用clientSocket.close()。这将在接收线程中抛出 SocketException。它会将你带出接收循环,如果接收循环后没有任何内容,线程将自行终止。
【讨论】:
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
}
}
检查套接字是否仍然连接它是多余的。无论如何,低级套接字读取都会这样做。
【讨论】:
你需要中断线程。
【讨论】: