问题:
我正在制作一个具有即时消息传递功能的应用程序。在大多数情况下,消息的发送和接收没有任何问题。但是一段时间后,大约在 10 到 40 分钟之间,如果客户端的套接字有一段时间没有被使用,消息将不再到达服务器。例如,如果我和某人聊天,让应用程序保持打开状态,小睡一会儿,然后再回来聊天,那么消息将不会发送。我 99% 确定这不是服务器端的问题,因为我打印了它收到的所有内容(但它没有收到任何东西),如果我用另一部手机登录,它工作正常。
我尝试过的:
起初我认为这是客户端的超时问题,因为在服务器端我一直收到错误提示“连接由对等方重置”,时间间隔为 10-40 分钟。我(几乎)通过使用 Java.net.socket
的 connect()
方法解决了这个问题,超时值为 0,这给出了无限超时:
clientSocket = new Socket();
clientSocket.connect( new InetSocketAddress(ServerInfo.IP, ServerInfo.PORT_NUMBER), 0 );
我现在很少收到“Connection reset by peer”的错误信息,但是一段时间后信息不发送的神秘问题仍然存在。
代码:
这是我的 sendMessage
函数,它总是记录“SOCKET OPERATOR SENDING MESSAGE: 'message'”:
public boolean sendMessage(String message)
{
PrintWriter out = null;
try
{
out = new PrintWriter( clientSocket.getOutputStream(), true );
Log.i( "MY_TAG", "SOCKET OPERATOR SENDING MESSAGE: " + message );
}
catch (IOException e)
{
e.printStackTrace();
Log.i( "MY_TAG", "SOCKET OPERATOR FAILEDD TO SEND MESSAGE WITH EXCEPTION: " + e.getMessage() );
return false;
}
out.println(message);
return true;
}
问题:
究竟是什么问题,或者我该如何进一步调试它?
最佳答案
在你做的事情上记录是徒劳的。什么都没有发生。
如果连接已死,发送迟早会导致 IOException:连接重置。
但由于套接字缓冲,这不是第一次。
当你得到这个异常时,不要只返回 false。关闭连接。
但是 这里的问题是PrintWriter。
它吞噬了异常。请参阅Javadoc。要么调用 checkError()
,它返回一个 boolean 值,指示是否存在异常,或者更好的是,根本不使用 PrintWriter
:使用 BufferedWriter .write()
和 .newLine()
,以及 .flush()
,所有这些都可以抛出 IOExceptions
。这样更好,因为您可以看到异常实际上是什么。当然,您必须将所有这些移动到 try
block 中,在目前具有误导性的日志消息之前。
并且不要为每条消息使用新的 PrintWriter
或 BufferedWriter
。在 socket 的使用生命周期内使用同一个。
关于java - 套接字停止发送消息但不超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31958572/