【发布时间】:2014-02-06 01:39:53
【问题描述】:
我正在开发一个使用套接字的程序,目前我的代码中有一个函数可以每秒检查来自客户端的心跳。
private void userLoop() { // checks for incoming data from client
Timer t = new Timer();
t.schedule(new TimerTask() {
@Override
public void run() {
try {
socketIn.read(); // check for heartbeat from client
String userInput;
while ((userInput = br.readLine()) != null) {
}
} catch (Exception e) {
ControlPanel.model.removeElement(getUsername());
ControlPanel.append(getUsername() + " has disconnected.");
}
}
}, 1000);
}
当客户通过 X 按钮关闭游戏、关闭计算机、注销时,无论是什么原因,我都会收到“'用户名'已断开连接”的消息。这正是我想要的,但是,它只适用于代码中的 while 循环。 while 循环基本上什么都不做,我不知道为什么它不能用 out。
如果我删除 while 循环并使用客户端断开连接,则服务器端不会打印任何内容。
String userInput;
while ((userInput = br.readLine()) != null) {
}
上面基本上是死代码,没有它我的程序就不能按它应该的方式工作..
为什么需要该代码,我怎样才能删除它并仍然让我的程序正常工作?
【问题讨论】:
-
什么是
socketIn?br是什么?它们有关系吗? -
br在读什么? -
The above is essentially the dead code。我不认为它死了。它一直读取缓冲的输入,直到它为空,这对我来说非常有意义。 -
这里是 SSCE:pastebin.com/eUQrvgsu
-
@Ted Hopp,您的回答是正确的。 EJB 是错误的。客户端或服务器,当 InputStream 关闭并且您尝试从中读取时,它将抛出 IOException。
标签: java sockets loops timer while-loop