博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA NIO Connection reset by peer 异常
阅读量:6256 次
发布时间:2019-06-22

本文共 2847 字,大约阅读时间需要 9 分钟。

hot3.png

客户端主动断开与服务端的连接,但是如果客户端掉线,服务端就接收不到了。。

异常信息

java.io.IOException: Connection reset by peer	at java.base/sun.nio.ch.FileDispatcherImpl.read0(Native Method)	at java.base/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)	at java.base/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)	at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:245)	at java.base/sun.nio.ch.IOUtil.read(IOUtil.java:223)	at java.base/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:358)	at space.pankui.nio.chat.ChatNIOServer.read(ChatNIOServer.java:123)	at space.pankui.nio.chat.ChatNIOServer.start(ChatNIOServer.java:100)	at space.pankui.nio.chat.ChatNIOServer.main(ChatNIOServer.java:27)客户端掉线了....
/**     * 读取客户端消息     */    private String read(SelectionKey key) {        SocketChannel socketChannel = (SocketChannel) key.channel();        String readResult = "客户端发送信息:";        try {            ByteBuffer readBuffer = ByteBuffer.allocate(256);            socketChannel.configureBlocking(false);            int read = 0;            try {                read = socketChannel.read(readBuffer);            } catch (IOException e) {                System.out.println("客户端掉线了....");                // https://stackoverflow.com/questions/8658118/when-is-java-io-ioexceptionconnection-reset-by-peer-thrown                // The remote forcibly closed the connection, cancel                // the selection key and close the channel.                // 需要在这里做判断 				key.cancel();                socketChannel.close();                return "客户端掉线";            }            //这个方法只能侦测到客户端主动断开与服务端的连接,但是如果客户端掉线,服务端就接收不到            if (read == -1) {                socketChannel.close();                key.cancel();            }            readBuffer.flip();            String result = new String(readBuffer.array(), StandardCharsets.UTF_8).trim();            System.out.println("客户端发送信息:" + result);            return readResult + result;        } catch (IOException e) {            e.printStackTrace();        }        return readResult;    }

注意 如果你的代码有读和写,在客户端掉线之后

key.cancel();    socketChannel.close();

当你在之后还有调用 SelectionKey 需要判断是否 有效。

while (iterator.hasNext()) {                    SelectionKey selectionKey = iterator.next();                    iterator.remove();                    // 每个都需要判断是否有效,因为客户端可能掉线了,然后就释放了                    if (selectionKey.isValid() && selectionKey.isAcceptable()) {                        this.accept(selectionKey);                    }                    if (selectionKey.isValid() && selectionKey.isReadable()) {                        this.read(selectionKey);                    }                    if (selectionKey.isValid() && selectionKey.isWritable()) {                        this.write(selectionKey);                    }                }

参考

下面这里给的方法解决不了客户端掉线问题

代码来源:

转载于:https://my.oschina.net/u/1394615/blog/3053331

你可能感兴趣的文章
[转]香农信息论与毒药称球问题
查看>>
HTTP Error 500.19
查看>>
我在博客园的这一年
查看>>
红黑树
查看>>
Jackson使用ObjectManage#readValue传入泛型T的问题
查看>>
Python正则表达式中的re.S的作用
查看>>
从零开始构建一个centos+jdk7+tomcat7的docker镜像文件
查看>>
Source Insight 中文注释为乱码解决办法(完美解决,一键搞定)
查看>>
【LoadRunner】安装LoadRunner
查看>>
Linux内存管理 (15)页面迁移
查看>>
在高并发、高负载的情况下,如何给表添加字段并设置DEFAULT值?
查看>>
Cocos2d-x 3.0final 终结者系列教程13-贪食蛇游戏案例(全)
查看>>
Nginx的try_files指令和命名location使用实例
查看>>
IO多路复用之select
查看>>
pd_ds中的hash
查看>>
买书不读是一种什么病?
查看>>
微信接口开发报错invalid credential, access_token is invalid or not latest hint
查看>>
nohup 部署springboot 使用命令
查看>>
MQ产品比较-ActiveMQ-RocketMQ
查看>>
暂时没有想好呢。
查看>>