我有一个客户端到服务器的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 仍处于连接状态的错误。由于网络问题,此连接经常中断。简而言之,它不能很好地工作。
我读过一个更好的设计:如何等待 WebSocket 的 readyState 更改,但并未涵盖我需要处理的所有情况。
我也用谷歌搜索过这个,但无法获得正确的程序。
那么通过Websockets发送常规数据的正确方法是什么,可以很好地处理这些问题,如连接中断等?
您似乎没有涵盖的事件即将发生。这应该工作得很好,因为每当连接终止时都会调用它。这比错误更可靠,因为并非所有连接中断都会导致错误。
我个人使用 Socket.IO,它支持客户端和服务器之间基于事件的实时双向通信。
它是事件驱动的。诸如此类的事件
on connection :: socket.on('conection',callback);
和
on disconnect :: socket.on('disconnect',callback);
内置 socket.io,因此可以帮助您解决连接问题。非常易于使用,如果您有兴趣,请查看他们的网站。
我在客户端上使用两层方案:抽象包装器 + websocket-client:
websocket-client的职责是与服务器交互,恢复连接并为抽象包装器提供接口(事件发射器和一些方法)。
抽象包装器是一个高级层,当连接暂时失败时,它与 websocket-client 交互,订阅其事件并聚合数据。抽象包装器可以为应用层提供任何接口,如 Promise、EventEmitter 等。
在应用程序层,我只使用抽象包装器,而不用担心连接或数据丢失。毫无疑问,在这里提供有关连接状态和数据发送确认的信息是个好主意,因为它很有用。
如有必要,我可以提供一些代码,例如
这显然是服务器问题,而不是客户端的问题。
我不知道这里的服务器是什么样子的。但是,过去当我从事基于websocket的项目时,这对我来说是一个巨大的问题。连接将不断断开。
所以我用java创建了一个websocket服务器,这解决了我的问题。
websockets依赖于很多设置,比如如果你使用servlets,那么servlet container的设置很重要,如果你使用一些php等,apache和php设置很重要,例如,如果你用PHP创建一个websocket服务器,PHP的默认超时为30秒,它将在30秒后中断。如果未设置保持活动状态,则连接将不会保持活动状态等。
作为快速解决方案,您可以做的是
- 在一定时间(例如 2 或 3 秒)后继续向服务器发送 ping,以便如果 websocket 断开连接,客户端就会知道它,以便它可以调用 onclose 或 ondisconnect,我希望你知道除了无法发送某些东西之外,没有办法找到连接是否断开。
- 检查服务器的保持活动状态标头
- 如果您有权访问服务器,则为超时等。
我认为这会有所帮助