我是服务器Websocket连接的客户端,应该在那里停留40秒左右。理想情况下它应该永远开放。
客户端不断向服务器发送数据,反之亦然。
现在我正在使用这个序列:
var socket;
function senddata(data)
{
if (!socket)
{
socket = new WebSocket(url);
socket.onopen = function (evt) {
socket.send(data);
socket.onmessage = function (evt) {
var obj = JSON.parse(evt.data);
port.postMessage(obj);
}
socket.oneerror = function (evt) {
socket.close();
socket = null;
}
socket.onclose = function(evt){
socket = null;
}
}
}
else
{
socket.send(data);
}
}
显然,根据当前逻辑,如果出现错误,可能根本不会发送当前请求数据。
坦率地说,有时会给出websocket仍然处于连接状态的错误。由于网络问题,此连接经常中断。简而言之,它不能很好地运作。
我已经阅读了更好的设计:How to wait for a WebSocket's readyState to change但并未涵盖我需要处理的所有情况。
此外,我已经用Google搜索了相关内容,但无法获得正确的程序。
那么通过Websockets发送常规数据的正确方法是什么,它可以很好地处理连接中断等问题?
答案 0 :(得分:2)
您似乎无法涵盖的事件是关闭的。哪个应该工作得很好,因为只要连接终止就会调用它。这比onerror更可靠,因为并非所有连接中断都会导致错误。
答案 1 :(得分:1)
我个人使用Socket.IO,它可以在客户端和服务器之间实现基于事件的双向实时通信。
这是事件驱动的。诸如
之类的活动 on connection :: socket.on('conection',callback);
和
on disconnect :: socket.on('disconnect',callback);
内置了socket.io,因此它可以帮助您解决连接问题。非常容易使用,如果您有兴趣,请查看他们的网站。
答案 2 :(得分:1)
我在客户端使用双层方案:abstract-wrapper + websocket-client:
websocket-client 的职责是与服务器交互,恢复连接并为abstract-wrapper提供接口(事件发射器和一些方法)。
abstract-wrapper 是一个高级层,当连接暂时失败时,它与websocket-client交互,订阅其事件和聚合数据。 abstract-wrapper 可以向应用层提供任何接口,如Promise,EventEmitter等。
在应用程序层,我只使用abstract-wrapper,不用担心连接或数据丢失。毫无疑问,这里有关于连接状态和数据发送确认的信息是个好主意,因为它很有用。
如果有必要,我可以提供一些代码,例如
答案 3 :(得分:0)
这显然是服务器问题,而不是客户端的问题。
我不知道服务器在这里的样子。但是,当我在基于websocket的项目上工作时,这对我来说是一个巨大的问题。连接会不断中断。
所以我在java中创建了一个websocket服务器,这解决了我的问题。
websockets取决于很多设置,比如你是否使用servlet然后servlet容器的设置很重要,如果你使用某些php等,apache和php设置很重要,例如你在php中创建一个websocket服务器,php的默认超时时间为30秒,30秒后就会中断。如果未设置keep-alive,则连接不会保持活动状态等。
快速解决方案可以做什么
我认为这会有所帮助