В чем разница между сокет, который открыт, и сокет, который подключен?

Класс 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.