即时通讯中,TCP和UDP哪个更好?

9

我需要用Java语言使用纯套接字实现客户端/服务器即时通讯。
服务器应服务大量客户端,并且我需要决定使用哪种套接字 - TCP还是UDP。
谢谢,Costa。


这取决于您的需求。您提供的唯一需求“大量客户”基本上是没有意义的,因为我们不知道您是否认为800个客户是“大量”还是16,000个。 - David Schwartz
它可以同时处理数万个客户端。 - Wizit
4个回答

8

TCP

原因:

TCP:确保传输的数据完整无误,且按照发送的顺序到达。

UDP:没有保障消息或数据包是否能够到达。

了解更多信息:http://www.diffen.com/difference/TCP_vs_UDP

你想让你的聊天信息可能丢失吗?

编辑:我错过了“大型聊天程序”的部分。基于该聊天程序的性质,它需要是一个TCP服务器,我无法想象用户通过UDP协议发送的实际文本内容。

TCP服务器的最大限制是同时65536个连接。如果您真的需要超过这个数字,可以创建一个分发服务器,根据当前服务器负载将传入的连接发送到适当的服务器。


其实我不想让任何消息丢失,但是服务器能够创建的套接字有限制吗?据我了解,TCP会为每个已连接的TCP客户端打开一个套接字。 - Wizit
除非您计划实现一个非常大的聊天程序,否则不必担心服务器的负载限制。TCP服务器的最大连接数为65536个。是的,您必须对每个客户端保持开放连接。 - ug_

5
你可以同时使用TCP和UDP。使用TCP来交换实际的消息(以便不会丢失数据,也能够传输包含JPG等大型消息),仅使用UDP发送短连接“connectNow”消息到已排队的客户端。客户端可能具有各种状态(NotLoggedIn,TCPconnected,TCPdisconnected,LoggedOut),并具有各种超时时间来控制状态转换以及正常的消息交换事件。UDP的“connectNow”消息会指示处于“TCPdisconnected”状态的客户端进行连接,并移动到“TCPconnected”状态,在那里保持交换消息,直到某个不活动计时器指示客户端暂时断开连接。这显然是不可靠的,因此您可能希望每X秒重复发送“connectNow”消息N次,直到客户端连接。无论如何,客户端应该每隔X分钟尝试轮询,以防万一...

1

这取决于用户是否需要知道消息是否已经传递到服务器。UDP数据包没有内在的确认机制。如果客户端向服务器发送即时消息并且在传输过程中丢失,那么客户端和服务器都不会知道。

(简短的答案是“使用TCP”...但值得自己思考设计影响。)


1
TCP会给你可靠性,在即时通讯时这是非常理想的,因为你不希望在对话过程中丢失消息。
然而,如果你打算使用群组通信,那么你可能最终会使用多播。对于这种情况,UDP将是正确的选择,因为UDP可以处理点对多点。使用TCP进行多播应用程序将很困难,因为现在发送方必须跟踪多个接收器的重传/发送速率。一个替代方法是在点对点聊天中使用TCP,而在群组通信中使用UDP。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接