我正在研究在移动设备上运行的 HTML/Javascript,它与在 PC 上运行的 Qt/C++ 应用程序进行通信。移动设备和 PC 都在本地网络上。 HTML 页面(客户端)和 C++ 应用程序(服务器)之间的通信是使用 Websockets 完成的。
HTML 页面是 C++ 应用程序的远程控制,因此需要在移动设备和 PC 之间建立低延迟连接。
当使用任何非 Apple 设备作为客户端时,数据发送的速率在 60 到 120 帧/秒之间,这是完全可以接受的。使用 Apple 设备时,此速率降至 3-4 帧/秒。 我还检查了 ping 时间(Websocket 实现,而不是来自命令行的 ping 命令)。只要设备不传输数据,它们对于 Apple 设备是可接受的(1-5 毫秒)。每当它传输数据时,此 ping 时间都会增加到 200 毫秒。
从 Javascript 方面来看,Apple 设备始终以 60 帧/秒的一致速率发送数据,就像任何其他设备一样。但是,在服务器端,当客户端是 Apple 设备时,这 60 帧中只有 3 到 4 帧被接收到。
有人知道会发生什么吗?
这是我的 Javascript 代码:
<script language="javascript" type="text/javascript">
var wsUri = document.URL.replace("http", "ws");
var output;
var websocket;
function init()
{
output = document.getElementById("output");
wsConnect();
}
function wsConnect()
{
console.log("Trying connection to " + wsUri);
try
{
output = document.getElementById("output");
websocket = new WebSocket(wsUri);
websocket.onopen = function(evt)
{
onOpen(evt)
};
websocket.onclose = function(evt)
{
onClose(evt)
};
websocket.onmessage = function(evt)
{
onMessage(evt)
};
websocket.onerror = function(evt)
{
onError(evt)
};
}
catch (e)
{
console.log("Exception " + e.toString());
}
}
function onOpen(evt)
{
alert("Connected to " + wsUri);
}
function onClose(evt)
{
alert("Disconnected");
}
function onMessage(evt)
{
alert('Received message : ' + evt.data);
}
function onError(evt)
{
alert("Error : " + evt.toString());
}
function doSend(message)
{
websocket.send(message);
}
window.addEventListener("load", init, false);
</script>
使用 dosend() 函数从 Javascript 端发送数据。
最佳答案
一些想法和建议。
- 检查服务器是否支持客户端的 WebSocket 协议(protocol)。 This问答讨论不同协议(protocol)版本成为问题的案例。
- WebSocket standard允许实现任意延迟传输并执行分段。此外,Ping 等控制帧不支持分段,但允许插入。这些允许的行为差异可能导致时间差异。
- 检查
bufferedAmount
是否WebSocket 上的属性以确定 WebSocket 是否正在缓冲数据。如果bufferedAmount
属性通常为零,则数据已传递给操作系统,操作系统可能会根据操作系统或套接字配置(例如 Nagle)对其进行缓冲。 . - This问答提到通过让服务器为每条消息发送确认来解决延迟。
- 要更深入地了解交互,执行数据包跟踪可能会有用。 This Mac Developer Library 中的技术问答可能会提供一些关于如何完成此任务的资源。
关于javascript - 在苹果设备上运行的 Websockets 网络性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14609858/