0

我们的项目实现了自己的基于NIO的长连接框架进行推送,它曾经可以正常工作。最近出现了一些问题,"SocketChannel.read(byteBuffer)" throw exception "java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer)",具体如下: 在此处输入图像描述

图片包含错误信息

错误代码如下:

private void read(ByteBuffer byteBuffer, int length) throws Exception {
        int count = 0;
        long readBeginMills = SystemClock.elapsedRealtime();
        while (count < length) {
            try {
                int readCount = mSocketChannel.read(byteBuffer);
                long nowMills = SystemClock.elapsedRealtime();
                if (readCount > 0) {
                    count += readCount;
                    readBeginMills = nowMills;
                }
                //1.readCount为-1时是连接断开了,直接报错重连
                //2.如果读取数据超过了20s也报错重连
                if(nowMills - readBeginMills >= 20000 || readCount == -1){
                    throw new LostTcpByteException("byte lost exception,need to shutdown and reconnection");
                }
            } catch (Exception e) {
                throw e;
            }
        }
    }

我找了很多类似的错误,但没有找到解决问题的好主意,我该怎么办?感谢您的任何回答!

4

1 回答 1

3

任何一个:

  1. 您已将数据发送到已被对等方关闭的连接
  2. 对等方在其套接字接收缓冲区中仍有未读数据时关闭了连接
  3. 对等点正在 Windows 上运行,并且其进程已退出。
  4. 对等体故意重置连接,我不会在这里详述。
  5. 出现了各种主机或网络条件之一,例如连接超时或失败。
于 2017-05-17T07:33:33.297 回答