Подтвердить что ты не робот

В чем разница между закрытием входа/выхода и закрытием Socket напрямую?

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

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

Спасибо заранее!

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

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

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

Ответ 3

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

Вопрос, когда я его прочитал, - "Можно ли закрыть поток в сокете, а затем открыть поток в том же сокете?"... но люди, кажется, отвечают на это: "Как я должен чисто закрыть мои socket?"... это вопрос не задан.

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

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