2016-12-31 3 views
0

Как говорится в названии - если я хочу закрыть соединение сокета, достаточно ли, если я просто позвоню mySocket.close()? Что будет с другой стороны?Is Socket.close() считается чистым способом завершения соединения?

Или, если это не путь, что такое? Должен ли я послать какое-то сообщение «закончить» через сокет, чтобы другая сторона знала, что он тоже должен закончиться?

Бонус вопрос: ява Документации говорит

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

Таким образом, закрытие сокета достаточно, или я должен явно закрывать потоки (при условии, что я не использую try-with-resources, конечно)?

ответ

3

Закрытие гнезда не будет делать ничего с другой стороны. Удаленный хост не будет знать, что соединение было закрыто. Единственный способ проверить, закрыто ли соединение, - попытаться прочитать или записать из/в поток ввода/вывода. Если -1 возвращается методом InputStream#read(), то вторая сторона знает, что первая сторона закрыла соединение. Брошенный IOException также указывает на закрытое соединение.

Обычно вам не нужно закрывать входной/выходной поток, когда они закрываются при вызове Socket#close(). Socket#close() - единственное, что вам нужно сделать, чтобы закрыть соединение.

Но если у вас есть поток обертки (например, BufferdInputStream/), вы должны явно закрыть эти потоки-обертки, чтобы освободить ресурсы, используемые этими потоками-оболочками (например, массив байтовых буферов). Вам нужно только закрыть поток обтекателя верхнего уровня, так как закрытие обертки закрывает обернутый поток, который также закрывает обернутый поток обернутого потока. И так далее ...

+0

Это определенно отвечает на мой вопрос о бонусе и благодарит вас за это. Но это не отвечает на мой главный вопрос. – NPS

+0

Посмотрите на мой отредактированный anwser. –

+0

Итак, подведем итог: 'Socket.close()' ** это ** чистый путь, но я ** также ** должен заботиться о вещах с другой стороны (проверьте «-1»/Исключение и дескриптор он, также вызывающий 'Socket.close()'). Если я использую обтекатели потоков, мне также необходимо явно закрыть их. Это верно? – NPS

0

Socket.close() - это чистый способ закрыть соединение. Он вызывает отправку пакета TCP FIN для однорангового узла, начиная обычную последовательность выключения TCP. Он также закрывает InputStream и OutputStream сокета, я не вижу никакой двусмысленности в документации по этому вопросу.

+0

В документации указывается это явно, но в то же время я видел примеры кодов, где люди закрывали обтекатели потоков вручную. Ответ Дж. Тенни преувеличивает, почему это так, и это именно то, чего я здесь не видел. Вот почему я спросил бонусный вопрос. – NPS

Смежные вопросы