我需要使用 Java 语言中的纯套接字来实现客户端/服务器即时消息。
服务器应该为大量客户端提供服务,我需要决定应该使用哪些套接字 - 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) 这样的状态,带有各种超时来控制状态转换以及正常的消息交换事件。UDP 'connectNow' 消息将指示 'TCPdisconnected' 中的客户端进行连接,因此移动到'TCPconnected',他们将停留在那里,交换消息,直到某个不活动计时器指示客户端暂时断开连接。这当然是不可靠的,因此您可能希望重复 'connectNow' 每 X 秒发送 N 次消息,直到客户端连接。在任何情况下,客户端都应该每 X 分钟尝试一次轮询,以防万一……
TCP 将为您提供可靠性,这在即时消息传递过程中当然是可取的——您不希望消息在转换过程中被丢弃。
但是,如果您打算使用群发消息,那么您最终可能会使用多播。对于这种情况,UDP 将是正确的选择,因为 UDP 可以处理点对多点。将 TCP 用于多播应用程序会很困难,因为现在发送方必须跟踪多个接收方的重传/发送速率。一种替代方法是使用 TCP 进行点对点聊天并使用 UDP 进行群组消息传递。
这取决于用户是否需要知道消息是否已传递到服务器。UDP 数据包没有固有的确认。如果客户端向服务器发送 IM 消息并且在传输过程中丢失,客户端或服务器都不会知道它。
(简短的回答是“使用 TCP”……但值得自己考虑设计含义。)