我知道过去有过类似的问题,我研究了大部分问题,但无法让我的代码正常工作。
我有一个用Java编写的TCPIP服务器和一个客户端Android应用程序。
当我在手机上关闭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");
}
}
但同样,没有任何反应。即使客户端没有连接到互联网,我也不会通过向客户端发送消息来收到任何错误。
我做错了什么?
答案 0 :(得分:2)
您应该在套接字上设置超时。默认情况下,如果连接没有机会告诉对方它正在关闭连接,它们将永远等待。
socket.setSoTimeout(timeout)
您应该在连接的客户端和服务器端设置超时。
答案 1 :(得分:1)
当readLine()
返回null时,您应该停止阅读。将永远不会有更多数据。
如果read()
为任何X返回-1或readXXX()
抛出EOFException
,则同样适用。