2012-03-02 37 views
7

Ho scritto un semplice programma di socket, funziona bene, ma il mio amico usa uno strumento di scansione delle porte, quando esegue la scansione sulla porta che sto usando, incassa con errore "java.net.SocketException: Broken pipe", cosa succede? e come risolverlo?Perché si verifica un "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(); 

} 

Particolare errore da console:

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()' non restituisce nulla. Il test è inutile. – EJP

risposta

7

Alcuni port scanner lavoro iniziando ad aprire una connessione e poi subito a terminarlo. Il tuo server non è programmato per gestire un errore di connessione perché non hai codificato per quella possibilità. Dovrai usare un try/catch per intrappolare quella condizione e recuperare. Inoltre, dovresti probabilmente passare la connessione a un thread separato per l'elaborazione, in modo che il tuo programma principale possa continuare a ricevere nuove connessioni (e inviarle ai thread da gestire).

2

Penso che questo accada quando il terminale remoto ha chiuso la connessione;

-1

Una clausola di "tiri usati" con SocketException e IOException o mettere try catch alla fine come suggerito dal mio amico sopra. Infine, non dimenticare di chiudere tutti i flussi che stai utilizzando. Controlla anche il tuo numero di porta su entrambi i programmi client e server. Hopw questo aiuterà.

0

La ragione del problema potrebbe essere qui:

JavaDoc:

La lunghezza della coda massima per le indicazioni di connessione in entrata (una richiesta per collegare ) è impostato su 50. Se un'indicazione di connessione arriva quando la coda è piena, la connessione viene rifiutata.

E si dovrebbe aumentare "arretrato" parametro del vostro ServerSocket, ad esempio

int backlogSize = 50 ; 
providerSocket = new ServerSocket(portNum, backlogSize); 
Problemi correlati