В чем разница между закрытием Input / OutputStream и закрытием Socket напрямую? - PullRequest
20 голосов
/ 07 августа 2010

Мне просто интересно, что делает java, когда мы вызываем close для inputStream и outStream, связанных с сокетом.В чем отличие от вызова close для сокета, т.е. Socket.close ().

, если мы просто закрываем поток io на сокете, но не закрываем сокет, можем ли мы открыть поток io наснова сокет?

Заранее спасибо!

Ответы [ 3 ]

17 голосов
/ 07 августа 2010

Из документации Java API для Socket :

public void close () бросает IOException Закрывает эту розетку. Любой поток, в настоящее время заблокированный в операции ввода-вывода на этом сокете, вызовет исключение SocketException.

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

Закрытие этого сокета также закроет сокет InputStream и OutputStream.

Если у этого сокета есть связанный канал, то канал также закрывается.

Закрытие InputStream Сокета приведет к закрытию Сокета. То же самое касается закрытия OutputStream сокета.

Из документации Java API для Socket # getInputStream ()

Закрытие возвращенного InputStream закроет связанный сокет.

Проверьте документацию по API, она есть по какой-то причине.

10 голосов
/ 07 августа 2010

Вы должны закрыть самый внешний выходной поток, который вы создали из сокета. Это очистит это. Закрытие либо сокета, либо входного потока не делает этого, поэтому оно не подходит. Закрыв этот выходной поток, вам больше ничего не нужно делать.

1 голос
/ 04 февраля 2013

Это больше похоже на комментарий, чем на хороший ответ: (Я бы лучше добавил комментарий к одному из ответов выше, но у меня нет представителя)

Вопрос, как я его прочитал, таков:«Могу ли я закрыть поток в сокете, а затем открыть поток в том же сокете?» ... но люди, похоже, отвечают на это: «Как мне аккуратно закрыть мой сокет?» ... вопрос не в этомспросил.

Ответ на поставленный вопрос - «нет».Когда вы закрываете поток, вы закрываете сокет.

(я понимаю, почему, по крайней мере, в одном случае, кто-то может задать этот вопрос. Когда вы передаете свойства Java через сокет принимающей сторонедолжен увидеть EOF, чтобы распознать конец свойств - для того, чтобы получатель увидел EOF, отправитель должен закрыть поток / сокет. НО, если у вас есть протокол команды / ответа, работающий над этим сокетом, вы НЕ хотите закрыватьили вы потеряете канал, на который хотите отправить ответ. См. Свойства потоковой передачи Java через сокет , чтобы узнать, как это сделать)

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