如何注意到客户端与服务器断开连接 - JAVA
How to notice that client disconnected from server - JAVA
我知道过去有过类似的问题,我研究了其中的大部分问题,但无法使我的代码正常工作。
我有一个用 Java 编写的 TCPIP 服务器和一个客户端 Android 应用程序。
当我关闭 phone 上的 WLAN 时,我显然没有连接到我的服务器,但服务器没有注意到这一点。
我在服务器上的读取方式
try {
bufferSender = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//this while it's like a listener for messages
String message = null;
while (running) {
try {
message = in.readLine();
if (message == null)
System.out.println(this.user.getUsername() + " left the room.");
} catch (IOException e) {
System.out.println("Error reading message: " + e.getMessage());
running = false;
managerDelegate.userDisconnected(this);
}
if (message != null && managerDelegate != null) {
user.setMessage(message);
System.out.println("message:" + message);
// notify message received action
managerDelegate.messageReceived(user);
}
}
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
}
我了解到在尝试读取来自客户端的消息时应该会出错。但是我没有收到任何错误。
所以我尝试每隔 X 秒从服务器向客户端发送一条消息。
我是这样发送的:
public void sendMessage(String message) {
if (bufferSender != null && !bufferSender.checkError()) {
bufferSender.println(message);
bufferSender.flush();
} else {
System.out.println("ERROR");
}
}
但同样,没有任何反应。即使客户端没有连接到互联网,我也不会通过向客户端发送消息得到任何错误。
我做错了什么?
您应该在套接字上设置超时。默认情况下,如果连接没有机会告诉另一方它正在关闭连接,它们将永远等待。
socket.setSoTimeout(timeout)
您应该在连接的客户端和服务器端都设置超时。
当 readLine()
returns 为 null 时,您应该 停止阅读。 将不再有任何数据。
对于任何 X,如果 read()
returns -1 或 readXXX()
抛出 EOFException
,同样适用。
我知道过去有过类似的问题,我研究了其中的大部分问题,但无法使我的代码正常工作。
我有一个用 Java 编写的 TCPIP 服务器和一个客户端 Android 应用程序。
当我关闭 phone 上的 WLAN 时,我显然没有连接到我的服务器,但服务器没有注意到这一点。
我在服务器上的读取方式
try {
bufferSender = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//this while it's like a listener for messages
String message = null;
while (running) {
try {
message = in.readLine();
if (message == null)
System.out.println(this.user.getUsername() + " left the room.");
} catch (IOException e) {
System.out.println("Error reading message: " + e.getMessage());
running = false;
managerDelegate.userDisconnected(this);
}
if (message != null && managerDelegate != null) {
user.setMessage(message);
System.out.println("message:" + message);
// notify message received action
managerDelegate.messageReceived(user);
}
}
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
}
我了解到在尝试读取来自客户端的消息时应该会出错。但是我没有收到任何错误。
所以我尝试每隔 X 秒从服务器向客户端发送一条消息。 我是这样发送的:
public void sendMessage(String message) {
if (bufferSender != null && !bufferSender.checkError()) {
bufferSender.println(message);
bufferSender.flush();
} else {
System.out.println("ERROR");
}
}
但同样,没有任何反应。即使客户端没有连接到互联网,我也不会通过向客户端发送消息得到任何错误。
我做错了什么?
您应该在套接字上设置超时。默认情况下,如果连接没有机会告诉另一方它正在关闭连接,它们将永远等待。
socket.setSoTimeout(timeout)
您应该在连接的客户端和服务器端都设置超时。
当 readLine()
returns 为 null 时,您应该 停止阅读。 将不再有任何数据。
对于任何 X,如果 read()
returns -1 或 readXXX()
抛出 EOFException
,同样适用。