java - 套接字停止发送消息但不超时

标签 java android sockets

问题:

我正在制作一个具有即时消息传递功能的应用程序。在大多数情况下,消息的发送和接收没有任何问题。但是一段时间后,大约在 10 到 40 分钟之间,如果客户端的套接字有一段时间没有被使用,消息将不再到达服务器。例如,如果我和某人聊天,让应用程序保持打开状态,小睡一会儿,然后再回来聊天,那么消息将不会发送。我 99% 确定这不是服务器端的问题,因为我打印了它收到的所有内容(但它没有收到任何东西),如果我用另一部手机登录,它工作正常。

我尝试过的:

起初我认为这是客户端的超时问题,因为在服务器端我一直收到错误提示“连接由对等方重置”,时间间隔为 10-40 分钟。我(几乎)通过使用 Java.net.socketconnect() 方法解决了这个问题,超时值为 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 中,在目前具有误导性的日志消息之前。

并且不要为每条消息使用新的 PrintWriterBufferedWriter。在 socket 的使用生命周期内使用同一个。

关于java - 套接字停止发送消息但不超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31958572/

相关文章:

java - Java 中的代理 - 客户端不显示响应?

c - 一次将数据写入多个套接字(一个系统调用)

java - 有关 URLEncoder 和 URLDecoder 的一些问题?

java - .pack() 有什么作用?

java - 如何计算存储 N 位所需的 long(64 位)数?

java - 从android中的外部存储访问或打开数据库

java - Eclipse 插件控制台产品

android - 使用 Android 作为音频输入输出

android - 在 Material slider 上隐藏拇指

Python 简单 TCP 中继