2011-12-28 2 views
22
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) 

Этот журнал с игрового сервера реализован с использованием нетти. Что может вызвать это исключение?Когда «java.io.IOException: соединение сброшено сверстником» брошено?

+1

Я думаю, что волшебник побережья бросил заклинание, потому что каждая операция, которую вы делаете, потерпит неудачу. Предоставьте код, вызывающий исключение, иначе мы не сможем вам помочь – andreapier

+1

Ну, клиент отклонил/закрыл соединение. Вам понадобятся журналы клиентов, чтобы узнать, в чем причина. – Thomas

+1

@andreapier, поскольку это исключение похоже связано с сетью, я не могу предоставить исходный код. спасибо за ответ (и шутка), хотя – WorM

ответ

33

java.io.IOException: сброс соединения одноранговой

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

+0

Кажется хорошим объяснением – minhas23

4

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

3

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

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

+1

Это не значит только это, и это не ограничивается только Netty. – EJP

+1

Не понимаю. WorM разместил трассировку стека с помощью операции чтения, но все ответы объясняют проблему написания. –

+0

Ссылка не работает. Это: [BadClientSilencer] (https: // github.ком/xitrum-основа/xitrum/BLOB/Master/SRC/главная/Scala/xitrum/обработчик/въездной/BadClientSilencer.scala). Помог мне! – mxro

-1

Я думаю, что это должно быть 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 { 
+0

Но это не так. См. Вопрос. – EJP

-1

Для меня полезного кода ведьмы помочь мне было 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

Не отвечает на вопрос. – EJP

-1

Есть много факторов, сначала посмотрите, возвращает ли сервер результат, а затем проверяют между сервером и клиентом.

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

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

+1

Вы можете добавить некоторый намек на то, как «исправить» и выполнить эти «проверки», чтобы улучшить этот ответ. – m02ph3u5

+1

Hi http://stackoverflow.com/users/890537/m02ph3u5 1. серверная сторона, вы можете увеличить время ожидания между сервером и источником данных. 2. может улучшить время сеанса сервера. 3.Вы можете улучшить время Apache для запроса на сервер. 4. Улучшение времени ожидания. –

+0

Он получает исключение при чтении с сервера. Ваш ответ не имеет смысла. – EJP

Смежные вопросы