我目前正在开发Java WebSocket客户端应用程序,我必须确保客户端收到服务器的每条消息。由于连接中断,我是否可能丢失一些消息(一旦从服务器发送)? WebSocket基于TCP,所以这不应该发生吗?
答案 0 :(得分:7)
可能会发生。 TCP保证数据包的顺序,但并不意味着即使在底层网络中发生不可恢复的故障时,从服务器发送的所有数据包也都会到达客户端。想象一下,当您的应用程序与您的服务器通信时,有人会在最糟糕的时机拔出您的LAN电缆或关闭您的WiFi接入点。 TCP没有克服这样的麻烦。
为确保从服务器发送的每个WebSocket消息都到达客户端,您必须在应用程序层中实现某种SYN / ACK。
答案 1 :(得分:1)
TCP是一种保证协议 - 数据包将由远端较高的应用程序级别以正确的顺序接收(这与UDP是一个发送和希望协议相反)。
一般来说,TCP应该用于所有数据必须在远端正确到达的连接。 UDP用于可以丢弃丢失的数据包而没有重大问题(例如,流服务,NTP更新)
答案 2 :(得分:1)
在我的游戏中,为了应对丢失的Web套接字消息,我为每条消息添加了一个int / long ID。当客户端检测到接收到的ID序列有问题时,客户端将向服务器请求新数据,以便能够正确恢复。
答案 3 :(得分:0)
TCP具有称为控制流的东西 - 这意味着它提供可靠,有序和错误检查的传送。 换句话说,TCP是一种不断检查数据是否到达的协议。
该协议有不同的机制来确保这一点。 您可以在下面的链接中看到TCP和UDP(没有控制流)之间的区别。