2012-03-02 14 views
7

Escribí un programa de socket simple, funciona bien, pero mi amigo usa una herramienta de escaneo de puertos, cuando escanea al puerto que estoy usando, cobra con el error "java.net.SocketException: Broken pipe", ¿qué pasa? ¿Y como resolverlo?¿Por qué se producirá una "java.net.SocketException: Broken pipe"?

providerSocket = new ServerSocket(portNum); 
connection = providerSocket.accept(); 
if (connection.getOutputStream() != null) { 
    //this line crash!!! 
    out = new ObjectOutputStream(connection.getOutputStream()); 
    out.flush(); 

} 

Detalle de error de la consola:

java.net.SocketException: Broken pipe 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136) 
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1847) 
    at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1756) 
    at java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:230) 
+1

'connection.getOutputStream()' no vuelve nula. La prueba no tiene sentido – EJP

Respuesta

7

Algunos analizadores de puertos de trabajo al comenzar a abrir una conexión e inmediatamente después de derogación del mismo. Su servidor no está programado para tratar una falla de conexión porque no codificó esa posibilidad. Tendrá que usar un try/catch para atrapar esa condición y recuperarla. Además, probablemente deba entregar la conexión a un hilo separado para su procesamiento, para que su programa principal pueda continuar recibiendo nuevas conexiones (y enviándolas a hilos para que sean manejadas).

2

Creo que esto sucede cuando el extremo remoto cerró la conexión;

-1

Ya sea que use la cláusula throws con SocketException y IOException o ponga try catch finalmente como mi amigo sugirió anteriormente. Finalmente, no olvide cerrar todas las transmisiones que esté usando. Y también verifique su número de puerto en los programas de cliente y servidor. Hopw esto ayudará.

0

La razón de su problema puede estar aquí:

JavaDoc:

La longitud máxima de cola para las indicaciones de conexión entrantes (una petición para conectar ) se ajusta a 50. Si llega una indicación de conexión cuando la cola está llena, se rechaza la conexión.

Y debe aumentar el parámetro "atraso" de su ServerSocket, por ejemplo

int backlogSize = 50 ; 
providerSocket = new ServerSocket(portNum, backlogSize); 
Cuestiones relacionadas