dis*_*ted 10 browser tcp websocket
我正在使用websockets将来自服务器的视频图像传输到客户端,该客户端是一个HTML页面.我在下面分享的经验是Chrome.
我通过websocket的onmessage处理程序接收图像.在接收图像时,我可能需要异步完成许多任务才能显示图像.即使这些任务没有完成,另一个onmessage()可能会触发.我不想排队图像,因为此时我无法像服务器正在进行那样快速地进行,因为显示旧图像毫无意义.我也不想放弃这些图像,我根本不想接收它们.
如果客户端使用传统的TCP连接,它将停止从连接中读取.这将导致接收缓冲区被填充,接收窗口被关闭,并最终暂停在服务器上发送图像.一旦客户端开始读取,接收缓冲区将清空,接收窗口将打开,服务器将恢复传输.每次我的服务器开始发送图像时,它会选择最新鲜的图像.这种选择最新鲜的行为以及TCP的流量控制确保了在许多情况下的合理行为.
是否可以通过websockets获得TCP的流量控制功能,其中websockets基于?我特别感兴趣的是一个依赖于TCP流控制而没有应用程序级流控制的解决方案,因为这往往会产生不必要的额外延迟.
现在可以在 WebSocket 中使用流。Chrome 78 将附带一个新的 WebSocketStream API,它支持背压。
这是Chrome 平台状态的引述:
WebSocket API 为 RFC6455 WebSocket 协议提供了一个 JavaScript 接口。虽然它表现良好,但从人体工程学的角度来看它很尴尬,并且缺少背压的重要特征。WebSocketStream API 的目的是通过将流与 WebSocket API 集成来解决这些缺陷。
当前,WebSocket API 无法对接收到的消息应用背压。当消息到达的速度比页面可以处理它们的速度快时,渲染进程将填满缓冲这些消息的内存,或者由于 100% 的 CPU 使用率而变得无响应,或者两者兼而有之。
对发送的消息应用背压是可能的,但涉及轮询 bufferedAmount 属性,这是低效且不符合人体工程学的。
不幸的是,这是一个仅限 Chrome 的 API,在撰写本文时还没有网络标准。
有关更多信息,请参阅:
我怀疑你所要求的是可能的。WebSocket API 规范中没有该功能的接口。然而,规范所概述的是要求在使用 WebSocket 的脚本之外的后台管理底层套接字连接,以便脚本不会被 WebSocket 操作阻止。当套接字接收到入站数据时,它会将数据包装在消息中并将其排队以供 WebSocket 脚本处理。当消息保留在队列中等待脚本处理它们时,没有什么可以阻止套接字读取更多数据。
您可以在 WebSocket 中实现的唯一真正的流控制是显式的。当消息到达时,发回一条消息以确认它。在发送下一条消息之前,让服务器等待接收该确认。
| 归档时间: |
|
| 查看次数: |
3755 次 |
| 最近记录: |