java.net.SocketException: сокет закрыт TCP Client Server Communication

Я создаю приложение клиент / сервер Java через TCP, где у нас есть два сокета:

  • Один предназначен для обмена сообщениями.
  • Два - для передачи файлов.

Я создал на сервере два ServerSockets, чтобы создать Socket One и Two, приняв ServerSockets.

Сначала клиент отправляет несколько байтов через первый Socket
, чтобы сообщить серверу, какой файл ему нужен.

Затем Сервер через второй сокет отправляет файл клиенту.
После того, как клиент получает файл, пытается отправить обратно на сервер сообщение о завершении передачи.

Здесь я получаю исключение для закрытого сокета.
Однако до сих пор я никогда не закрывал розетку.
Я закрываю только буфер, который отправляет файл.
Даже если я попытаюсь снова открыть socketInputStream после отправки файла, ошибка останется прежней.
Также, если я не закрою буфер, который отправляет файл, клиент не получит файл.

Исключение сервера

Ошибка в возвращаемом сообщении - java.net.SocketException: сокет закрыт

Исключение клиента

Ответ сервера - java.net.SocketException: программное обеспечение вызвало прерывание соединения: ошибка записи сокета

Что я делаю неправильно?


person lemanou    schedule 02.04.2013    source источник
comment
Вам действительно стоит добавить код и трассировку стека ...   -  person Jorge Cardoso    schedule 02.04.2013
comment
Убедитесь, что вы закрываете соединение на одном из концов, если это не так, чем я уверен, что вы закрываете поток ввода или вывода, не закрывайте их, пока не убедитесь, что передача данных завершена, и вы сбрасываете ( ) всякий раз, когда вы хотите отправить данные в сокет   -  person Vijay    schedule 02.04.2013


Ответы (1)


Исключение «Socket closed» означает, что приложение, которое перехватило исключение, закрыло сокет, а затем продолжило попытки его использовать. Вы можете не знать, что закрытие входного или выходного потока сокета закрывает другой поток, а также сокет. Для «программного прерывания соединения» см. Повторяющуюся ссылку.

person user207421    schedule 03.04.2013
comment
Я закрываю только буфер, который отправляет файл, который читает outPutStream сокета. Это единственное, что, как я думаю, закрывает Socket. Если я не закрою буфер, клиент не получит файл. - person lemanou; 03.04.2013
comment
@lemanou Значит, вы закрыли сокет. Позже вы получите исключение «сокет закрыт», потому что вы продолжали использовать закрытый сокет. Вам придется открыть новый. - person user207421; 05.04.2013
comment
На самом деле да. Вот в чем проблема. Я заменил считыватель буфера на DataOutputStream и, прочитав файл с помощью FileInputStream, отправил его через DataOutputStream. Мне нужно только закрыть FileInputStream, чтобы завершить передачу. Спасибо! :) - person lemanou; 05.04.2013