java - 为什么 SocketChannel 调用 read(byteBuffer) 会抛出 java.net.SocketException : recvfrom failed: ECONNRESET (Connection reset by peer)

标签 java android nio socketchannel econnreset

我们的项目基于NIO实现了自己的长连接框架进行推送,曾经运行正常。最近出现一些问题,“SocketChannel.read(byteBuffer)”抛出异常“java.net.SocketException: recvfrom failed: ECONNRESET (Connection Reset by Peer)”,详细信息如下: enter image description here

图像包含错误消息

错误代码如下:

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;
            }
        }
    }

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

最佳答案

或者:

  1. 您已将数据发送到已被对等方关闭的连接
  2. 当其套接字接收缓冲区中仍有未读数据时,对等方关闭了连接
  3. 对等方正在 Windows 上运行,并且其进程已退出。
  4. 对等方故意重置了连接,我在此不再详细说明。
  5. 出现了各种主机或网络状况之一,例如连接超时或故障。

关于java - 为什么 SocketChannel 调用 read(byteBuffer) 会抛出 java.net.SocketException : recvfrom failed: ECONNRESET (Connection reset by peer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44017634/

相关文章:

java - ExecutorCompletionService 仅在单线程中运行,但 ExecutorService 使用所有 CPU

c# - 获取安卓版本信息

java - 替代 Java 选择器实现

java - 使用 FileChannel : Java 从 RandomAccessFile 读取特定字节

java - Java 中正则表达式的问题

java - 多个 Spring 3.2 计划任务不会并行运行

java - 安卓内存问题

java - 无法解析方法 'subscribeon(io.reactivex.scheduler)'

android - 在android中的多行edittext中获取特定行的内容

java - Netty NioSocketChannel 在多线程写入时收到损坏的消息