Мне нужно реализовать клиент-серверный мессенджер с использованием чистых сокетов на языке Java.
Сервер должен обслуживать большое количество клиентов, и мне нужно решить, какие сокеты использовать - TCP или UDP.
Спасибо, Коста.
Что лучше для мессенджера TCP или UDP?
Ответы (4)
TCP
Причина:
TCP: «Существует абсолютная гарантия того, что переданные данные останутся неповрежденными и поступят в том же порядке, в котором они были отправлены».
UDP: «Нет гарантии, что отправленные сообщения или пакеты вообще дойдут».
Узнайте больше на: http://www.diffen.com/difference/TCP_vs_UDP.
Хотели бы вы, чтобы ваше сообщение в чате могло быть потеряно?
Правка: я пропустил часть о "большой программе чата". Я думаю, что из-за характера программы чата она должна быть TCP-сервером, я не могу представить фактическое текстовое содержимое, отправляемое пользователями по протоколу UDP.
Максимальное ограничение для TCP-серверов составляет 65536 одновременных подключений. Если вам действительно нужно пройти мимо этого числа, вы можете создать диспетчерский сервер, который будет отправлять входящие соединения на соответствующий сервер в зависимости от текущей загрузки сервера.
Вы могли бы использовать оба. Используйте TCP для обмена фактическими сообщениями (чтобы не было потери данных и потоковой передачи больших сообщений (например, содержащих jpeg и т. д.). Используйте UDP только для отправки коротких сообщений «connectNow» клиентам, для которых есть сообщения в очереди. Клиенты может иметь такие состояния, как (NotLoggedIn, TCPconnected, TCPdisconnected, LoggedOut) с различными тайм-аутами для управления переходами состояний, а также обычными событиями обмена сообщениями. «TCPconnected», где они будут оставаться, обмениваясь сообщениями, пока некоторый таймер бездействия не даст указание клиенту отключиться на данный момент.Это, конечно, было бы ненадежно, и поэтому вы можете повторять сообщение «connectNow» каждые X секунд в течение N раз. пока клиент не подключится. В любом случае клиент должен пытаться проводить опрос каждые X минут, на всякий случай...
Это зависит от того, нужно ли пользователю знать, были ли сообщения доставлены на сервер. Пакеты UDP не имеют внутреннего подтверждения. Если клиент отправит IM-сообщение на сервер и оно потеряется в пути, ни клиент, ни сервер не узнают об этом.
(Короткий ответ: «использовать TCP»… но стоит подумать о последствиях проектирования для себя.)
TCP обеспечит вам надежность, что, безусловно, желательно при обмене мгновенными сообщениями — вы бы не хотели, чтобы сообщения пропадали во время разговора.
Однако, если вы собираетесь использовать групповой обмен сообщениями, вы можете в конечном итоге использовать многоадресную рассылку. Для таких случаев UDP будет правильным выбором, так как UDP может обрабатывать точку-многоточку. Использование TCP для многоадресных приложений будет затруднено, поскольку теперь отправителю придется отслеживать повторные передачи/скорость отправки для нескольких получателей. Одной из альтернатив может быть использование TCP для двухточечного чата и использование UDP для группового обмена сообщениями.