2012-03-02 3 views
7

Я написал простую программу сокетов, она отлично работает, но мой друг использует инструмент сканирования порта, когда он сканирует порт, который я использую, он получает наличные деньги с ошибкой «java.net.SocketException: Broken pipe», что происходит? и как его решить?Почему произойдет «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(); 

} 

Подробно об из консоли:

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()' не возвращает нуль. Тест бессмыслен. – EJP

ответ

7

Некоторые сканеры портов работают, начиная открыть соединение, а затем сразу же его завершением. Ваш сервер не запрограммирован на работу с сбоем подключения, потому что вы не кодировали эту возможность. Вам нужно будет использовать try/catch, чтобы уловить это условие и восстановить. Кроме того, вам, вероятно, следует отделить подключение к отдельному потоку для обработки, поэтому ваша основная программа может продолжать получать новые подключения (и отправлять их в потоки, которые будут обрабатываться).

2

Я думаю, что это происходит, когда удаленный конец закрыл соединение;

-1

Любое использование предложения throws с SocketException и IOException или положить try catch, наконец, как предложил мой друг выше. В конце концов не забудьте закрыть все потоки, которые вы используете. Также проверьте номер своего порта как на клиентских, так и на серверных программах. Хоп это поможет.

0

Причина вашей проблемы может быть здесь:

JavaDoc:

Максимальная длина очереди для входящих показаний подключения (а запрос на подключение) установлен на 50. Если индикация соединения прибывает Когда очередь заполнена, соединение будет отклонено.

И вы должны увеличить "неудовлетворенный" параметр Вашего ServerSocket, например

int backlogSize = 50 ; 
providerSocket = new ServerSocket(portNum, backlogSize); 
Смежные вопросы