我最近设置了一个工作正常的本地WebSocket服务器,但是我在理解如何处理客户端或服务器都没有故意启动的突然连接丢失时遇到了一些麻烦,即:服务器断电、以太网电缆被拔出等...我需要客户端的知道是否连接已在~ 10秒内丢失。
客户端,连接简单:
var websocket_conn = new WebSocket('ws://192.168.0.5:3000');
websocket_conn.onopen = function(e) {
console.log('Connected!');
};
websocket_conn.onclose = function(e) {
console.log('Disconnected!');
};
字符串
我可以手动断开连接,
websocket_conn.close();
型
但是如果我只是简单地从计算机后面拔出以太网电缆,或者禁用连接,onclose
就不会被调用。我在另一篇文章中读到,它最终会在TCP detects loss of connectivity时被调用,但它不是我需要的及时方式,因为我相信Firefox的默认时间是10分钟,我真的不想在数百台计算机about:config
上更改这个值。我读到的唯一的其他建议是使用“ping/pong”保持活动轮询风格的方法,这似乎与websockets的想法相反。
有没有更简单的方法来检测这种断开连接行为?我正在阅读的旧帖子从技术Angular 来看仍然是最新的吗?最好的方法仍然是“乒乓”风格?
6条答案
按热度按时间iq0todco1#
需要增加乒乓方法
当接收到**ping发送回pong**时,在服务器中创建代码
JavaScript代码给予
字符串
r1zk6ea12#
这是我最终做的解决方案,目前看起来工作得很好,它完全特定于我的项目设置,依赖于我的问题中最初没有提到的标准,但如果其他人碰巧在做同样的事情,它可能会很有用。
与WebSocket服务器的连接发生在Firefox插件中,默认情况下Firefox的TCP设置有10分钟的超时。您可以通过
about:config
和搜索TCP查看更多详细信息。Firefox插件可以访问这些参数
字符串
并通过指定分支& preference沿着新值来更改这些参数
型
所以现在,任何安装了插件的计算机都有10秒的TCP连接超时。如果连接丢失,则会触发
onclose
事件,该事件将显示警报并尝试重新建立连接型
dffbzjpn3#
我使用了乒乓球的想法,它工作得很好。下面是我在server.js文件中的实现:
字符串
下面是我的index.html文件:
型
这里有一个链接到云9沙盒,如果你想尝试一下自己:https://ide.c9.io/design1online/web-sockets
qoefvg9y4#
WebSocket协议定义了ping和pong的控制帧。因此,基本上,如果服务器发送ping,浏览器将以pong应答,并且它也应该以相反的方式工作。也许你使用的WebSocket服务器实现了它们,你可以定义一个超时,在这个超时内浏览器必须响应或者被认为是死的。这对于浏览器和服务器中的实现都应该是透明的。
您可以使用它们来检测半开连接:http://blog.stephencleary.com/2009/05/detection-of-half-open-dropped.html
还相关:WebSockets ping/pong, why not TCP keepalive?
mhd8tkvw5#
好吧,我迟到了,但希望我能在这里增加一些价值。我在
Angular
应用程序中的TypeScript实现用于处理WebSocket
连接丢失。这不使用PING PONG
策略,以避免让服务器一直处于忙碌状态。只有在连接丢失后才开始尝试建立连接,并在每5秒后继续尝试,直到连接成功。我们开始吧字符串
就是这样。如果你想在某个时候关闭WebSocket连接,请设置
selfClosing = true
。这将停止再次尝试重新连接。希望这对你有帮助。我敢肯定,同样的代码也可以在原生JS
中使用。9jyewag06#
您可以用途:
window.addEventListener(“offline”,closeHandler)//在断开LAN连接后1秒内为我工作
代码:
const createChannel =()=> {
ws && closeChannelCommon()
ws = new WebSocket(“wss:social-network.samuraijs.com/handlers/ChatHandler.ashx“)
ws?.addEventListener('open',openHandler)
ws?.addEventListener('message',messageHandler)
ws?.addEventListener('close',closeHandler)
window.addEventListener('offline',closeHandler)
}
const closeHandler =()=> {console.log(“网络连接已丢失。”);}