Что лучше для мессенджера TCP или UDP?

Мне нужно реализовать клиент-серверный мессенджер с использованием чистых сокетов на языке Java.
Сервер должен обслуживать большое количество клиентов, и мне нужно решить, какие сокеты использовать - TCP или UDP.
Спасибо, Коста.


person Wizit    schedule 08.09.2013    source источник
comment
Это зависит от ваших требований. Единственное требование, которое вы нам поставили, большое количество клиентов, в принципе бессмысленно, потому что мы не знаем, считаете ли вы 800 клиентов большим числом или 16 000.   -  person David Schwartz    schedule 08.09.2013
comment
Это могут быть десятки тысяч клиентов одновременно   -  person Wizit    schedule 08.09.2013


Ответы (4)


TCP

Причина:

TCP: «Существует абсолютная гарантия того, что переданные данные останутся неповрежденными и поступят в том же порядке, в котором они были отправлены».

UDP: «Нет гарантии, что отправленные сообщения или пакеты вообще дойдут».

Узнайте больше на: http://www.diffen.com/difference/TCP_vs_UDP.

Хотели бы вы, чтобы ваше сообщение в чате могло быть потеряно?

Правка: я пропустил часть о "большой программе чата". Я думаю, что из-за характера программы чата она должна быть TCP-сервером, я не могу представить фактическое текстовое содержимое, отправляемое пользователями по протоколу UDP.

Максимальное ограничение для TCP-серверов составляет 65536 одновременных подключений. Если вам действительно нужно пройти мимо этого числа, вы можете создать диспетчерский сервер, который будет отправлять входящие соединения на соответствующий сервер в зависимости от текущей загрузки сервера.

person ug_    schedule 08.09.2013
comment
На самом деле я не хочу, чтобы сообщение было потеряно, но есть ли какие-либо ограничения на количество сокетов, которые может создать сервер? Насколько я понимаю, TCP открывает сокет для каждого подключенного TCP-клиента. - person Wizit; 08.09.2013
comment
Я бы не беспокоился об ограничениях нагрузки на ваш сервер, если только вы не планируете реализовать смехотворно большую программу чата. Максимальное ограничение на TCP-сервере составляет 65536 подключений. И да, вы должны иметь открытое соединение с каждым клиентом. - person ug_; 08.09.2013

Вы могли бы использовать оба. Используйте TCP для обмена фактическими сообщениями (чтобы не было потери данных и потоковой передачи больших сообщений (например, содержащих jpeg и т. д.). Используйте UDP только для отправки коротких сообщений «connectNow» клиентам, для которых есть сообщения в очереди. Клиенты может иметь такие состояния, как (NotLoggedIn, TCPconnected, TCPdisconnected, LoggedOut) с различными тайм-аутами для управления переходами состояний, а также обычными событиями обмена сообщениями. «TCPconnected», где они будут оставаться, обмениваясь сообщениями, пока некоторый таймер бездействия не даст указание клиенту отключиться на данный момент.Это, конечно, было бы ненадежно, и поэтому вы можете повторять сообщение «connectNow» каждые X секунд в течение N раз. пока клиент не подключится. В любом случае клиент должен пытаться проводить опрос каждые X минут, на всякий случай...

person Martin James    schedule 08.09.2013

Это зависит от того, нужно ли пользователю знать, были ли сообщения доставлены на сервер. Пакеты UDP не имеют внутреннего подтверждения. Если клиент отправит IM-сообщение на сервер и оно потеряется в пути, ни клиент, ни сервер не узнают об этом.

(Короткий ответ: «использовать TCP»… но стоит подумать о последствиях проектирования для себя.)

person Stephen C    schedule 08.09.2013

TCP обеспечит вам надежность, что, безусловно, желательно при обмене мгновенными сообщениями — вы бы не хотели, чтобы сообщения пропадали во время разговора.

Однако, если вы собираетесь использовать групповой обмен сообщениями, вы можете в конечном итоге использовать многоадресную рассылку. Для таких случаев UDP будет правильным выбором, так как UDP может обрабатывать точку-многоточку. Использование TCP для многоадресных приложений будет затруднено, поскольку теперь отправителю придется отслеживать повторные передачи/скорость отправки для нескольких получателей. Одной из альтернатив может быть использование TCP для двухточечного чата и использование UDP для группового обмена сообщениями.

person Manoj Pandey    schedule 08.09.2013