我有一个依赖于服务器更新信息的Web应用程序。在过去,客户端将在完成前一个1000ms后发送一个ajax请求。它工作得很好,但浪费了资源。当客户端支持它时,应用程序已转换为使用websocket(如果不支持,则转换为Ajax)。
过去,ajax通过指示浏览器每秒刷新一次活动来提供脉冲。现在,它看起来已经死了,只是坐在那里工作。我有以下内容:
function connect() {
$("#text1").text('Socket Status: '+socket.readyState+' (connecting)');
socket.onopen = function(){
$("#text1").text('Socket Status: '+socket.readyState+' (open)');
}
socket.onmessage = function(msg){ checkDATA(msg.data); }
socket.onclose = function(){
$("#text1").text('Socket Status: '+socket.readyState+' (close)');
setTimeout(function () { connect(); },500);
}
socket.onerror = function(){
$("#text1").text('Socket Status: '+socket.readyState+' (error) '+msg.data);
}
}
所以我确实有一些状态指示,但没有显示脉搏。我应该假装一个脉冲还是可以/应该做些什么不同/更好的事情以确保连接正常?
答案 0 :(得分:1)
在下面,websocket只是一个TCP套接字。因此,首先应该监视所有可能的错误情况和套接字通知。然后,第二,如果你想确定地知道套接字仍然存在,你将不得不发送一个常规数据并寻找服务器响应。
您应该注意,在电池供电的设备(手机,平板电脑,笔记本电脑)上,除非心跳之间有很长的持续时间,否则常规网络心跳可能会严重耗尽电池电量。
另一种替代方案是实现非常智能的错误处理,以便对接收的数据进行发送和某种智能检测。对于发送,如果您发送一些数据并发现由于套接字似乎无法运行而出现错误,那么您可以自动拆除连接并创建一个新连接并尝试再次发送数据。与此相关的是你必须仔细编码,以避免任何类型的循环,你得到一个错误,重新创建套接字,得到一个错误,重新创建套接字,一遍又一遍。通常情况下,您只会重试次数很少(2-3次),并且会在连续重试之间留出时间。
对于接收,如果您希望每隔一段时间(至少每15分钟)从服务器获得一次更新,并且自上次更新以来已经过去了一段时间,那么您可能希望测试现有连接看它是否仍然存在。
使用这种技术的优点是,当事情正常工作时,您不再使用任何必要的传输/电池,但仍然有一些故障检测/处理方案,以自动检测何时连接可能遇到麻烦并自动恢复。