Как решить сброс соединения по узлу: ошибка записи сокета?

Когда я читаю содержимое файла с сервера, он возвращает следующее сообщение об ошибке:

Caused by: java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:215)
at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462)
at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)
at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:240)
at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:119)
at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:192)
at org.apache.coyote.Response.doWrite(Response.java:504)
at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:383)
... 28 more

и моя программа сервлета

 response.setContentType("application/octet-stream");
 response.setHeader("Content-Disposition","attachment;filename="+filename);
 FileInputStream in = new FileInputStream(new File(filepath));
 ServletOutputStream output=response.getOutputStream();
 byte[] outputByte=new byte[4096];
 while(in.read(outputByte,0,4096)!=-1){
     output.write(outputByte,0,4096);//error indicates in this line
 }
 in.close();
 output.flush();
 output.close();

Как решить эту проблему?


person Babu R    schedule 20.10.2012    source источник
comment
Что такое клиент и как он читает ответ, если он написан вами?   -  person Serge    schedule 20.10.2012
comment
Опубликуйте трассировку стека, которая указывает на ошибку в строке output.write(). Как и просил Серж, пожалуйста, также опубликуйте код клиента, если это применимо.   -  person Deepak Bala    schedule 20.10.2012
comment
Я сделал запрос к этому сервлету с помощью функции jquery ajax.   -  person Babu R    schedule 20.10.2012
comment
Я загружаю файл в onclick() div.   -  person Babu R    schedule 20.10.2012
comment
@BabuR ты нашел решение этой проблемы? Я борюсь с той же проблемой, пытаясь передать видео через сервлет.   -  person ishan    schedule 11.11.2012
comment
Прочтите это для полного объяснения и возможного решения: ?lq=1" title="javax net ssl sslexception ошибка чтения ssl 0x9524b800 ошибка ввода-вывода во время работы системы"> stackoverflow.com/questions/30538640/   -  person Devendra Vaja    schedule 14.07.2015


Ответы (5)


У меня такое же исключение, и в моем случае проблема заключалась в процессе повторного согласования. На самом деле мой клиент закрыл соединение, когда сервер попытался изменить набор шифров. После копания выяснилось, что в обновлении 22 jdk 1.6 процесс повторного согласования отключен по умолчанию. Если ваши ограничения безопасности не позволяют этого сделать, попробуйте включить небезопасное повторное согласование, задав системному свойству sun.security.ssl.allowUnsafeRenegotiation значение true. Вот некоторая информация о процессе:

Повторное согласование сеанса — это механизм в протоколе SSL, который позволяет клиенту или серверу инициировать новое квитирование SSL во время текущей связи SSL. Первоначально повторное согласование было разработано как механизм для повышения безопасности текущего канала SSL путем запуска обновления криптоключей, используемых для защиты этого канала. Однако эта мера безопасности не требуется для современных криптографических алгоритмов. Кроме того, повторное согласование может использоваться сервером для запроса сертификата клиента (для выполнения проверки подлинности клиента), когда клиент пытается получить доступ к определенным защищенным ресурсам на сервере.

Кроме того, есть отличный пост об этой проблеме в подробно и написано (ИМХО) понятным языком.

person Dmitry    schedule 15.07.2013

Сокет был закрыт клиентом (браузером).

Ошибка в вашем коде:

byte[] outputByte=new byte[4096];
while(in.read(outputByte,0,4096)!=-1){
   output.write(outputByte,0,4096);
}

Последний пакет, прочитанный, а затем записанный, может иметь длину ‹ 4096, поэтому я предлагаю:

byte[] outputByte=new byte[4096];
int len;
while(( len = in.read(outputByte, 0, 4096 )) > 0 ) {
   output.write( outputByte, 0, len );
}

Это не ваш вопрос, это мой ответ... ;-)

person Aubin    schedule 20.10.2012
comment
Хотя вы правы в записи правильной длины байтов в поток, это не должно вызывать ошибку «Сброс соединения узлом». Клиент должен просто увидеть какой-то мусор после правильных данных. - person Deepak Bala; 20.10.2012
comment
Спасибо за ваш ответ. Я пробовал с вашим кодом. но он показывает java.lang.IndexOutOfBoundsException - person Babu R; 20.10.2012
comment
Я решил indexoutofbounds pbm. но та же проблема, о которой я просил, остается: \ - person Babu R; 20.10.2012
comment
java.net.SocketException: сброс соединения узлом: ошибка записи сокета в org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388) в org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk. java:462) в org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366) в org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:413) в org.apache.catalina .connector.OutputBuffer.write(OutputBuffer.java:401) в org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:91) - person Babu R; 20.10.2012

Правильный способ «решить» это закрыть соединение и забыть о клиенте. Клиент закрыл соединение, пока вы еще писали ему, поэтому он не хочет вас знать, так что все, не так ли?

person user207421    schedule 20.10.2012
comment
не могли бы вы сказать мне, как закрыть соединение? - person Babu R; 20.10.2012
comment
@BabuR Закройте выходной поток. - person user207421; 21.10.2012

Похоже, ваша проблема может возникнуть в

while(in.read(outputByte,0,4096)!=-1){

где он может войти в бесконечный цикл из-за того, что не продвигает смещение (которое всегда равно 0 в вызове). Пытаться

while(in.read(outputByte)!=-1){

который по умолчанию попытается прочитать до outputByte.length в byte[]. Таким образом, вам не нужно беспокоиться о смещении. См. Метод чтения FileInputStrem

person prajeesh kumar    schedule 20.10.2012