我的代码如下所示,这是服务器代码(Runnable
)
public void run() {
while (true) {
try {
System.out.println("Waiting for client...");
this.socket = serverSocket.accept();
System.out.println("Client accepted");
while (true) {
readCommand();
try {
Thread.sleep(2);
} catch (Exception e) {
}
}
} catch (Exception ex) {
Main.error("Server stopped for current host", ex);
}
}
}
我的问题是:当客户端关闭连接时,他仍然等待readCommand();
中的命令读取,直到命令被发送并且将抛出EOFException
。这是我的readCommand
方法:
private void readCommand() throws Exception {
Object o = new ObjectInputStream(socket.getInputStream()).readObject();
if (o instanceof Command) {
((Command) o).execute();
return;
}
if (o instanceof Recorder) {
System.out.println("Recording received");
((Recorder) o).executeRecord();
return;
}
if (o instanceof MyKeyEvent) {
((MyKeyEvent) o).execute();
return;
}
}
所以我认为在阅读之前必须检查连接是否已打开。
修改:如果我评估run
- 方法代码,EOFException
会抛出try-catch-body
。但他不再接受客户了。
答案 0 :(得分:3)
如果客户端关闭连接,EOFException
正是我所期望的。所以我不太确定你的问题是。也许您需要区分预期的客户端断开连接和意外的客户端断开连接。在这种情况下,您应该发送某种End-of-message
对象来标记传输结束?
如果要检查信息是否可用,则流上有available()方法。我认为您不需要Thread.sleep(2)
,顺便说一句,因为我希望在没有数据的情况下,有效输入流上的读取会挂起。
答案 1 :(得分:0)
你也可以“只”添加另一个try-catch来捕获EOFException
public void run() {
while (true) {
try {
System.out.println("Waiting for client...");
this.socket = serverSocket.accept();
System.out.println("Client accepted");
try {
while (true) {
readCommand();
try {
Thread.sleep(2);
} catch (Exception e) {
}
}
} catch (EOFException ex) {
System.out.println("client closed");
}
} catch (Exception ex) {
Main.error("Server stopped for current host", ex);
}
}
}
确定,命令结束更聪明/更优雅......