pri*_*out 3 javascript browser websocket
我的网络应用程序需要定期检查服务器是否已启动。这允许用户以任一顺序启动服务器和客户端。
为此,我只是WebSocket从setTimeout处理程序内部调用构造函数。
从使用的角度来看,这种策略效果很好,但对我开发人员来说很烦人,因为我在 Chrome 中看到很多控制台错误:
remote.html:194 WebSocket connection to 'ws://localhost:8082/' failed: Connection closed before receiving a handshake response
remote.html:194 WebSocket connection to 'ws://localhost:8082/' failed: Connection closed before receiving a handshake response
remote.html:194 WebSocket connection to 'ws://localhost:8082/' failed: Connection closed before receiving a handshake response
Run Code Online (Sandbox Code Playgroud)
这些并不是真正的错误,因为我的 Web 应用程序在服务器不可用的情况下完全没问题。它重复调用WebSocket构造函数(MDN)只是为了检查服务器是否已经启动。
有一个更好的方法吗?对于上下文,我的 Web 应用程序是在设备上运行的本机 C++ 应用程序的“远程控制”。
使用SharedWorker!时会抑制错误。请尝试以下操作:
主文件
<!doctype html>
<html>
<head>
<title>WS Test</title>
<script type="text/javascript"> (async () => {
await new Promise(r => window.addEventListener('load', r));
let worker = new SharedWorker('worker.js');
worker.port.onmessage = evt => console.log('MSG:', evt.data);
})() </script>
</head>
<body></body>
</html>
Run Code Online (Sandbox Code Playgroud)
工人.js
let ports = [];
onconnect = ({ ports: [ port ] }) => ports.push(port);
(async () => {
while (true) {
await new Promise(r => setTimeout(r, 1000));
let ws = new WebSocket('ws://localhost:9999/');
ws.addEventListener('error', evt => ports.forEach(port => port.postMessage('error')));
ws.addEventListener('open', evt => ports.forEach(port => port.postMessage('open')));
}
})();
Run Code Online (Sandbox Code Playgroud)
这给我的反馈是WebSocket正在击中Error,但不会在日志中产生任何额外的噪音:

(请注意,“某些消息已移至问题面板”是由于不符合标准的仓促测试 html - 如果您将此解决方案转移到您自己的代码中,它将消失!)
ASharedWorker没有指向任何特定选项卡的必要链接 - 出于这个原因,我看不出为什么 aSharedWorker的错误会在任何环境中的选项卡控制台中显示为噪音的理由。
| 归档时间: |
|
| 查看次数: |
220 次 |
| 最近记录: |