这涉及通过套接字的服务器 - 客户端网络。客户端线程在while(boolean)
循环上运行。它是从ClientBean类访问的,条件设置为false。这应该停止线程或终止它。但我看到线程尝试在设置线程的运行循环条件为false后再次读取socket的InputStream。这会抛出 SocketException 。
bean的代码部分: -
public void disconnect() {
client.setSendMessage(key + "disconnect");
thd.setRunning(false);
client.setRunning(false);
try {
client.getSock().close();
inputDisabled = sendBtnDisabled = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
线程的run()方法: -
public void run() {
while (running) {
try {
if (!sock.isClosed())
if ((receiveMessage = receiveRead.readLine()) != null) {
msg = receiveMessage;
}
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
我在if ((receiveMessage = receiveRead.readLine()) != null)
行上遇到异常。
为什么在线程停止后run()的循环再次执行?而且当我从bean关闭套接字时它如何满足条件if (!sock.isClosed())
?
答案 0 :(得分:0)
为什么在线程停止后run()的循环再次执行?
您的循环状态
while (running) {
所以当你做
时它会循环到running = false
} catch (IOException e) {
e.printStackTrace(); // print error and pretend it didn't happen.
}
简单的解决方案是将try / catch置于循环外部,以便在发生错误时打破循环,或者您可以关闭连接并再试一次
当我从bean关闭套接字时,它是如何满足条件if(!sock.isClosed())的?
一旦在套接字上调用close(),此方法将返回isClosed == true。