Когда создается исключение «java.io.IOException: сброс соединения по одноранговой сети»? - PullRequest
43 голосов
/ 28 декабря 2011
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. Что может вызвать это исключение?

Ответы [ 7 ]

57 голосов
/ 28 декабря 2011

java.io.IOException: сброс соединения по пиру

Другая сторона внезапно прервала соединение во время транзакции. Это может иметь много причин, которые не контролируются со стороны сервера. Например. конечный пользователь решил завершить работу клиента или внезапно сменить сервер, продолжая взаимодействовать с вашим сервером, либо произошел сбой клиентской программы, либо произошел сбой подключения конечного пользователя к интернету, либо произошел сбой компьютера конечного пользователя и т. д. и т. д.

13 голосов
/ 29 декабря 2011

Чтобы расширить ответ BalusC, любой сценарий, в котором отправитель продолжает запись после того, как узел прекратил чтение и закрыл свой сокет, вызовет это исключение, равно как и закрытие узла, в то время как он все еще имел непрочитанные данные в своем собственном приемном буфере сокета.Другими словами, ошибка протокола приложения.Например, если вы записываете что-то одноранговому узлу, который не понимает одноранговый узел, а затем он закрывает свой сокет в знак протеста, а затем продолжаете запись, стек TCP однорангового узла выдаст RST, что приведет к этому исключению и сообщениюу отправителя.

3 голосов
/ 30 декабря 2011

java.io.IOException в Netty означает, что ваш игровой сервер пытается отправить данные клиенту, но этот клиент закрыл соединение с вашим сервером.

И это не единственное исключение!Есть несколько других.См. BadClientSilencer в Xitrum.Я должен был добавить это, чтобы эти ошибки не испортили мой лог-файл.

0 голосов
/ 16 января 2019

java.io.IOException: сброс соединения по пиру

В моем случае проблема была в PUT-запросах (GET и POST проходили успешно).

Связь прошла через VPN-туннель и SSH-соединение. И был брандмауэр с ограничениями по умолчанию для запросов PUT ... Запросы PUT не передавались на сервер ...

Проблема была решена после добавления исключения в брандмауэр для моего IP-адреса.

0 голосов
/ 11 сентября 2015

Существует множество факторов: сначала посмотрите, возвращает ли сервер результат, а затем проверьте между сервером и клиентом.

сначала исправьте их со стороны сервера, затем проверьте условия записи между сервером и клиентом!

серверная сторона исправляет тайм-ауты между уровнемером данных и сервером со стороны клиента исправьте время ожидания и количество доступных соединений!

0 голосов
/ 21 февраля 2015

Для меня полезный код, который мне помог, был 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;
            }
...
0 голосов
/ 01 июля 2014

Я думаю, что это должно быть java.net.SocketException, так как его определение указано для ошибки TCP.

/**
 * Thrown to indicate that there is an error in the underlying 
 * protocol, such as a TCP error. 
 *
 * @author  Jonathan Payne
 * @version %I%, %G%
 * @since   JDK1.0
 */
public 
class SocketException extends IOException {
...