2012-03-02 21 views
7

Napisałem prosty program do obsługi gniazd, działa dobrze, ale mój przyjaciel używa narzędzia do skanowania portów, gdy skanuje do portu, którego używam, to jest gotówka z błędem "java.net.SocketException: Broken pipe", co się stało? i jak go rozwiązać?Dlaczego występuje "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(); 

} 

Szczegóły Błąd z konsoli:

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()' nie zwraca wartość null. Test jest bezcelowy. – EJP

Odpowiedz

7

Niektóre skanery portów praca zaczyna otwierać połączenia, a następnie natychmiast zakończenia go. Twój serwer nie został zaprogramowany do obsługi błędu połączenia, ponieważ nie zakodowałeś tej możliwości. Będziesz musiał użyć funkcji prób/catch, aby złapać ten stan i odzyskać. Powinieneś prawdopodobnie przekazać połączenie do oddzielnego wątku do przetworzenia, aby twój główny program mógł nadal odbierać nowe połączenia (i wysyłać je do wątków, które mają być obsługiwane).

2

Myślę, że dzieje się tak, gdy zdalny koniec zamknął połączenie;

-1

Zarówno użyta klauzula throws z SocketException i IOException lub umieścić catch próbny w końcu jak mój przyjaciel zasugerował powyżej.W końcu nie zapomnij zamknąć wszystkich strumieni, które używasz.I również sprawdzić numer portu zarówno po stronie klienta i programów po stronie serwera. Hopw to pomoże.

0

Przyczyną problemu może być tutaj:

JavaDoc:

Maksymalna długość kolejki dla przychodzących połączeń wskazań (prośba podłączenie) jest ustawiony na 50. Jeżeli oznaczenie połączenie przybywa , gdy kolejka jest pełna, połączenie zostanie odrzucone.

I należy zwiększyć parametr "zaległości" swojego ServerSocket np

int backlogSize = 50 ; 
providerSocket = new ServerSocket(portNum, backlogSize); 
Powiązane problemy