我正在使用 websockets 将视频图像从用 Go 编写的服务器传输到作为 HTML 页面的客户端。我在下面分享的经验是使用 Chrome。
我通过 websocket 的 onmessage 处理程序接收图像。在接收到图像时,我可能需要异步完成许多任务才能显示图像。即使这些任务没有完成,另一个 onmessage() 可能会触发。我不想对图像进行排队,因为此时我无法像服务器那样快速地进行,因为显示旧图像没有意义。我也不想丢弃这些图像,我根本不想接收它们。
客户端是否会使用传统的 TCP 连接,它会停止从连接中读取。这将导致接收缓冲区被填满,接收窗口被关闭,并最终暂停在服务器上发送图像。一旦客户端开始读取,接收缓冲区将清空,接收窗口将打开,服务器继续传输。每次我的服务器开始发送图像时,它都会选择最新鲜的图像。这种选择最新鲜的行为与 TCP 的流量控制一起确保了在许多情况下的合理行为。
是否可以通过 websockets 拥有基于 websockets 的 TCP 的流控制功能?我对依赖 TCP 流量控制且没有应用程序级流量控制的解决方案特别感兴趣,因为这往往会导致不必要的额外延迟。