Почему возникает «java.net.SocketException: Broken pipe»? - PullRequest
7 голосов
/ 02 марта 2012

Я написал простую сокетную программу, она отлично работает, но мой друг использует инструмент сканирования портов, когда он сканирует на порт, который я использую, он обналичивает с ошибкой "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)

Ответы [ 4 ]

8 голосов
/ 02 марта 2012

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

2 голосов
/ 02 марта 2012

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

0 голосов
/ 13 ноября 2015

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

JavaDoc:

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

И вам следует увеличить параметр «backlog» вашего ServerSocket, например,

int backlogSize = 50 ;
providerSocket = new ServerSocket(portNum, backlogSize);
0 голосов
/ 23 марта 2012

Либо используйте выражение throws с SocketException и IOException, либо put try catch finally, как мой друг предложил выше. Наконец, не забудьте закрыть все потоки, которые вы используете. А также проверьте номер порта в программах на стороне клиента и сервера. это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...