java tcp netty ioexception

¿Cuándo se lanza “java.io.IOException: restablecimiento de la conexión por par”?



tcp netty (6)

java.io.IOException: restablecimiento de la conexión por par

El otro lado ha abortado abruptamente la conexión en medio de una transacción. Eso puede tener muchas causas que no son controlables desde el lado del servidor. Por ejemplo, el usuario final decidió cerrar el cliente o cambiar el servidor bruscamente mientras aún interactuaba con su servidor, o el programa del cliente se ha bloqueado, la conexión a Internet del usuario final se ha interrumpido, o la máquina del usuario final se ha caído, etc.

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)

Este registro es de un servidor de juegos implementado usando netty. ¿Qué puede causar esta excepción?


Creo que esto debería ser java.net.SocketException ya que su definición se establece para un error de TCP.

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


Hay muchos factores, primero vea si el servidor devuelve el resultado, luego verifique entre el servidor y el cliente.

¡rectifíquelos primero del lado del servidor, luego verifique la condición de escritura entre el servidor y el cliente!

lado del servidor rectifique los tiempos de espera entre el administrador de datos y el servidor del lado del cliente, ¡rectifique el tiempo de espera y el número de conexiones disponibles!


Para ampliar la respuesta de BalusC, cualquier escenario en el que el remitente continúe escribiendo después de que el par haya dejado de leer y haya cerrado su socket producirá esta excepción. En otras palabras, un error de protocolo de aplicación. Por ejemplo, si escribe algo al interlocutor que el interlocutor no comprende y luego cierra su socket en señal de protesta, y luego continúa escribiendo, la pila TCP del interlocutor emitirá un RST, lo que da como resultado esta excepción y este mensaje. en el remitente


Para mí, el código útil que me ayudó fue http://rox-xmlrpc.sourceforge.net/niotut/src/NioServer.java

// El mando a distancia cerró forzosamente la conexión, cancela

// la tecla de selección y cerrar el canal.

/** * 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 {


java.io.IOException en Netty significa que su servidor de juegos intenta enviar datos a un cliente, pero ese cliente ha cerrado la conexión a su servidor.

¡Y esa excepción no es la única! Hay varios otros. Ver BadClientSilencer en Xitrum. Tuve que agregar eso para evitar que esos errores estropeen mi archivo de registro.