Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript WebSocket似乎无缘无故地被Google Chrome关闭了_Javascript_Node.js_Sockets_Websocket_Socket.io - Fatal编程技术网

Javascript WebSocket似乎无缘无故地被Google Chrome关闭了

Javascript WebSocket似乎无缘无故地被Google Chrome关闭了,javascript,node.js,sockets,websocket,socket.io,Javascript,Node.js,Sockets,Websocket,Socket.io,我正在使用Socket.io创建与Node.js的WebSocket连接。在某种程度上,我有一个长时间运行的函数,它会阻塞主线程,在这种情况发生之后,传输(在本例中是WebSocket)似乎被Google Chrome本身关闭了 后端上根本没有断开连接消息,close事件中的消息只是transport close 有人知道这是怎么发生的吗?我已经尝试过Socket.io的超时(pingTimeout和pingInterval),但这似乎对我的情况没有任何影响 编辑:好的,我已尝试更改服务器和客户

我正在使用Socket.io创建与Node.js的WebSocket连接。在某种程度上,我有一个长时间运行的函数,它会阻塞主线程,在这种情况发生之后,传输(在本例中是WebSocket)似乎被Google Chrome本身关闭了

后端上根本没有断开连接消息,
close
事件中的消息只是
transport close

有人知道这是怎么发生的吗?我已经尝试过Socket.io的超时(
pingTimeout
pingInterval
),但这似乎对我的情况没有任何影响

编辑:好的,我已尝试更改服务器和客户端上的
pingTimeout
pingInterval
,但均无效

以下是我使用的代码:

客户端:

this._socket = io(location.href, {
    path: `${location.path}socket.io`,
    reconnection: false,
    pingTimeout: 120000,
    pingInterval: 60000
});
const server = http.createServer();
const io = socketio(server, {
    pingTimeout: 120000,
    pingInterval: 60000
});
服务器:

this._socket = io(location.href, {
    path: `${location.path}socket.io`,
    reconnection: false,
    pingTimeout: 120000,
    pingInterval: 60000
});
const server = http.createServer();
const io = socketio(server, {
    pingTimeout: 120000,
    pingInterval: 60000
});
根据中的描述,您有两个问题需要解决:

1) 服务器向客户端发送心跳信号,然后等待响应的超时时间。如果未发送回响应,则服务器假定套接字未正常工作,并将其关闭

2) 客户机等待来自服务器的心跳信号一段时间,如果它确实收到心跳信号,则它假定套接字不起作用并关闭它并尝试重新连接

因此,要延长套接字可以在没有活动的情况下持续的时间,必须更改连接的客户端和服务器端的计时。仅在客户端上更改它不会阻止服务器关闭无法获得对其心跳消息响应的连接。有关如何更改这些心跳间隔和超时的更多讨论,请参见:


在阅读本主题时,请务必注意,您所阅读的内容适用于socket.io 1.x而不是较旧的版本,因为1.x的许多内容都发生了变化。

我想我也遇到了同样的问题:


疯狂的是,我把pingTimout设置为一个高得离谱的数字,所以肯定有其他东西正在关闭连接。但这似乎与主线堵塞有关

开始的地方是:“阻止主thead的长时间运行的函数”。这不是个好主意。如果这是socket.io,那么可能是因为您不允许客户端处理socket.io用来查看套接字是否仍处于活动状态的ping/pong消息。另外,请向我们展示您的具体代码,以及您在超时方面的具体尝试。“玩弄超时”根本不能告诉我们您尝试了什么或设置了什么。关于代码的问题应该包含您的实际代码!这里我们在理论或假设问题上做得很差,在实际代码上做得很好。Socket.io的心跳(ping/pong)超时默认为60秒。我知道长时间运行的函数不是一个好主意,但在解决这个问题之前,我需要确切地知道是什么导致断开连接。Google Chrome是否可能因为没有心跳超时而断开连接?在这里添加代码是非常困难的,因为它实际上只是:连接到服务器,阻塞主线程,断开连接。目前我使用这段代码来模拟一个阻塞函数:
let a=0;对于(让i=0;i<1000000000;i++){a+=i;}
当你说你“玩弄超时”时,我想看看你到底尝试了什么代码。有很多设置,文档不是很好。我想知道你到底试了什么。给我们看看代码。还有,您要处理一个长时间运行的函数多长时间?告诉我们有多少秒。而且,您是否也控制服务配置?您当前的问题中没有足够的信息,我们只能进行猜测,根据定义,我们给出的猜测问题不是很完整的问题。我已经添加了您询问的超时属性,长时间运行函数的代码在我的注释中。这将阻塞UI线程约3-5秒。我控制两个端点。我让你给我看你用来设置时间间隔的代码。我想先看看你做得是否正确。事实上,我曾尝试单独在服务器上做这件事。感谢您的输入,我将阅读您链接的帖子,看看它们是否对我有帮助。@robin\u f-您需要在客户端和服务器上配置更长的超时时间。我尝试了这个方法,但它仍然以错误代码1005关闭,循环完成后没有消息。即使有很长的超时和间隔。我更新了原来的问题。@Robin\u f-什么代码给出了错误1005和什么循环?请显示这些代码。我很确定所有代码都在那里。。但由于还不够清楚,我会在有时间的时候举个例子进行回购。