2012-03-09 61 views
1

我有一个Web应用程序,它依赖于来自服务器的更新信息。过去,客户端会在完成前1000ms后发送ajax请求。它运作良好,但浪费资源。当客户端支持该应用程序时,该应用程序已转换为使用websocket(如果不支持,则会降级为Ajax)。是否需要重申websocket连接?

在过去,通过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); 
    } 
} 

所以我有状态的一些指示,但没有显示的脉冲。我应该伪造一个脉冲,还是有一些不同的/更好的,可以/应该做的,以确保连接工作?

回答

1

底下,一个WebSocket的只是一个TCP套接字。所以,首先你应该监控所有可能的错误情况和套接字通知。然后,第二,如果你想确定地知道套接字还活着,你将不得不发送一个常规的数据并寻找服务器响应。

你应该注意到,在电池供电的设备(手机,平板电脑,笔记本电脑),常规的网络心跳可对电池显著漏除非有心跳之间的很长一段时间的持续时间。

另一种方法是实现非常聪明的错误处理发送和某种智能检测接收到的数据。对于发送,如果您发送一些数据并发现错误,因为套接字看起来不可操作,那么您可以自动关闭连接并创建一个新连接并尝试再次发送数据。与此相关的一个问题是,您必须小心谨慎地编写代码,以避免发生错误时出现任何类型的循环,重新创建套接字,发生错误,重新创建套接字,一遍又一遍。通常情况下,您只需重试少量次数(2-3次),并隔出连续重试之间的时间。

对于接收,如果您希望每隔一段时间(至少每隔15分钟)从服务器获取一次更新并且自上次更新以来的时间已经过去,那么您可能需要测试现有的连接以查看它是否仍然存在。

使用这种类型的技术的优点是,当事情正常工作时,您不再需要使用更多的传输/电池,但您仍然有一些故障检测/处理方案来自动检测连接可能会遇到麻烦并自动恢复。

+0

什么错误(S)我不能监控?我将这个函数封装在'try {} catch {}'中,当服务器重新启动时引发火灾。 'Catch'等待5秒钟并尝试重新连接。我删除了重新连接'onerror',因为每次出现错误时,我都将服务器的连接数加倍。如果我明白浏览器为什么/如何更改连接状态,测试连接似乎是可以避免的。 – shaun5 2012-03-18 03:36:04