什么时候抛出“java.io.IOException:Connection reset by peer”?

nkkqxpd9  于 2023-05-21  发布在  Java
关注(0)|答案(8)|浏览(353)
ERROR GServerHandler  - java.io.IOException: Connection reset by peer
java.io.IOException: Connection reset by peer
        at sun.nio.ch.FileDispatcher.read0(Native Method)
        at sun.nio.ch.SocketDispatcher.read(Unknown Source)
        at sun.nio.ch.IOUtil.readIntoNativeBuffer(Unknown Source)
        at sun.nio.ch.IOUtil.read(Unknown Source)
        at sun.nio.ch.SocketChannelImpl.read(Unknown Source)
        at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:323)
        at org.jboss.netty.channel.socket.nio.NioWorker.processSelectedKeys(NioWorker.java:282)
        at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:202)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

此日志来自使用netty实现的游戏服务器。什么会导致这种异常?

tpxzln5u

tpxzln5u1#

java.io.IOException:连接被对等体重置
另一方在事务处理过程中突然中止连接。这可能有许多原因,无法从服务器端控制。例如,最终用户决定关闭客户端或突然改变服务器,而仍然与您的服务器交互,或客户端程序崩溃,或最终用户的互联网连接中断,或最终用户的机器崩溃,等等。

yeotifhr

yeotifhr2#

为了扩展BalusC的答案,任何在对等端停止阅读并关闭其套接字后发送方继续写入的情况都会产生此异常,当对等端在其自己的套接字接收缓冲区中仍有未读数据时关闭也会产生此异常。换句话说,就是应用程序协议错误。例如,如果你向对等体写了一些对等体不理解的东西,然后它关闭了它的套接字以示抗议,然后你继续写,对等体的TCP堆栈将发出RST,这将导致发送方出现此异常和消息。

vsikbqxv

vsikbqxv3#

Netty中的java.io.IOException表示您的游戏服务器试图向客户端发送数据,但客户端已关闭与服务器的连接。
而这个例外并不是唯一的一个!还有其他几个参见Xitrum中的BadClientSilencer。我不得不添加它来防止这些错误弄乱我的日志文件。

bbuxkriu

bbuxkriu4#

java.io.IOException:连接被对等体重置
在我的例子中,问题出在PUT请求上(GET和POST成功通过)。
通信通过VPN隧道和SSH连接进行。而且有一个防火墙对PUT请求有默认限制... PUT请求还没有被传递到服务器。
在为我的IP地址向防火墙添加异常后,问题得到解决。

bfhwhh0e

bfhwhh0e5#

如果在使用Rider时,在构建Docker容器时发生这种情况。确保你所有的修改都被推送到git,删除你的本地仓库,然后再次克隆所有的东西,从一个全新的状态开始。这可能与文件权限被搞砸有关,但这立即为我修复了它

jljoyd4f

jljoyd4f6#

对我有用的代码巫婆帮助我是http://rox-xmlrpc.sourceforge.net/niotut/src/NioServer.java
//远程强制关闭连接,取消
//选择键并关闭通道。

private void read(SelectionKey key) throws IOException {
            SocketChannel socketChannel = (SocketChannel) key.channel();

            // Clear out our read buffer so it's ready for new data
            this.readBuffer.clear();

            // Attempt to read off the channel
            int numRead;
            try {
                numRead = socketChannel.read(this.readBuffer);
            } catch (IOException e) {
                // The remote forcibly closed the connection, cancel
                // the selection key and close the channel.
                key.cancel();
                socketChannel.close();
                return;
            }

            if (numRead == -1) {
                // Remote entity shut the socket down cleanly. Do the
                // same from our end and cancel the channel.
                key.channel().close();
                key.cancel();
                return;
            }
...
chhkpiq4

chhkpiq47#

有很多因素,首先看服务器是否返回结果,然后在服务器和客户端之间进行检查。
首先从服务器端纠正错误,然后检查服务器端和客户端之间的写入情况!
服务器端纠正数据层和服务器之间的超时,从客户端纠正超时和可用连接的数量!

l2osamch

l2osamch8#

它也可能意味着服务器完全不可访问-我在尝试访问离线服务器时得到了这个
我的客户端被配置为连接到localhost:3000,但没有服务器在该端口上运行。

相关问题