Класс Java Socket
имеет два метода isClosed
и isConnected
, чтобы проверить, закрыт или подключен сокет соответственно. Я хотел знать, какая разница между TCP-сокером, который только открыт, и сокет TCP, который открыт и подключен, и как это отличается от UDP.
В чем разница между сокет, который открыт, и сокет, который подключен?
Ответ 1
Чтобы просто прояснить, открытый Socket
- это сокет, который либо ждет соединения, либо успешно подключился к другому Socket
. Когда сокет был закрыт, это означает, что этот сокет больше не доступен для подключения и что его ресурсы уже выпущены. A Socket
, который подключен, ну, это означает, что сокет подключен к другому Socket
.
Итак, Socket
может..
- быть открытым и подключенным одновременно.
- быть открытым и не подключенным одновременно.
- не подключается при закрытии.
UPDATE
из @Bryan
По-видимому, есть полузакрытые или полуоткрытые состояния для TCP-сокетов; использование которого (сегодня) отличается от его первоначального значения. Подробнее об этой ссылке.
Ответ 2
Эта страница дает довольно хороший обзор состояний сокетов: http://diranieh.com/SOCKETS/SocketStates.htm и разницу между сокетами TCP и UDP. В частности:
- Состояние "Открыть" (TCP и UDP): создан неназванный сокет. Неименованный сокет - это тот, который не привязан к локальному адресу и порту
- Состояние "Подключено" (только TCP): между локальным и удаленным узлами установлена ассоциация (виртуальная схема). Теперь можно отправлять и получать данные.
Обратите внимание, что более новые реализации java.net.DatagramSocket поддерживают расширение для сетевых состояний TCP/IP: DatagramSocket также может находиться в состоянии "подключен", так что isConnected() не обязательно возвращает false, даже если датаграмма socket никогда не "подключен" к сетевому уровню. В частности: "Когда DatagramSocket подключен к удаленному адресу, пакеты могут быть отправлены или получены только с этого адреса. По умолчанию сокет датаграммы не подключен".
Для получения дополнительной информации см. источники и JavaDoc.