我有一个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);
}
}
所以我确实有一些状态的迹象,但没有任何迹象表明有脉搏。我应该只是伪造一个脉冲,还是应该做一些不同/更好的事情来确保连接正常工作?
在下面,websocket只是一个TCP套接字。因此,首先应该监视所有可能的错误条件和套接字通知。然后,第二,如果您想最终知道套接字仍然有效,则必须发送一段常规数据并查找服务器响应。
你应该注意,在电池供电的设备(手机、平板电脑、笔记本电脑)上,除非心跳之间的持续时间很长,否则定期的网络心跳可能会严重消耗电池。
另一种选择是对发送实现非常智能的错误处理,并对接收到的数据进行某种智能检测。对于发送,如果您发送了一些数据,但发现由于套接字似乎不可操作而出现错误,则可以自动断开连接并创建一个新连接,然后尝试再次发送数据。解决这个问题的方法是,你必须仔细编码,以避免出现任何类型的循环,在这种循环中,你会一次又一次地得到错误,重新创建套接字,得到错误,再重新创建套接字。通常,您只会重试少量(2-3次),并在连续重试之间留出时间。
对于接收,如果您希望每隔一段时间(比如至少每15分钟)从服务器获得一次更新,并且自上次更新以来已经过了很长时间,那么您可能需要测试现有连接,看看它是否仍然有效。
使用这种技术的优点是,当事情正常工作时,您不需要再使用任何必要的传输/电池,但您仍然有一些故障检测/处理方案,可以自动检测连接何时可能出现故障并自动恢复。