socket.io在轮询方面存在问题,不断连接/断开。

4

所以,这是一个大型应用的一部分,我试图通过集群和socket.io-redis让它运行,在未来需要进行扩展时,它可以跨多个节点和机器工作。

我似乎遇到了一些严重的问题,有些客户端无法保持连接。一些客户端会持续出现这种情况(主要是iOS设备,我想必须使用轮询传输),但是其他客户端有时候可以正常工作,有时候却不能(再次归因于使用轮询)。

我将所有功能剥离,结果发现集群并不是问题。

无论如何,这是我的server.js

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

var port = process.env.PORT || 3800;

/* -------------------------------- */

io.on('connection', function(socket){
    var datetime = new Date().toLocaleString();
    console.log(datetime+' - '+'a user connected - '+socket.id);
});

/* -------------------------------- */


http.listen(port, function() {
    var datetime = new Date().toLocaleString();
    console.log(datetime+' - '+'listening on *:' + port);
});

并在控制台输出

Wed Mar 11 2015 16:22:53 GMT+0000 (GMT) - listening on *:3800
Wed Mar 11 2015 16:22:54 GMT+0000 (GMT) - a user connected - YrLUOrgfpnQVwoWMAAAA
Wed Mar 11 2015 16:22:58 GMT+0000 (GMT) - a user connected - nH6x-97uf3iR2LgNAAAB
Wed Mar 11 2015 16:23:01 GMT+0000 (GMT) - a user connected - VsrFO31elPyKfQJcAAAC
Wed Mar 11 2015 16:23:08 GMT+0000 (GMT) - a user connected - 7xuKZ6aykYIDcxN-AAAD
Wed Mar 11 2015 16:23:15 GMT+0000 (GMT) - a user connected - ZsmZtFHmLrH1DxXWAAAE
Wed Mar 11 2015 16:23:22 GMT+0000 (GMT) - a user connected - HFUApMwwFZallJnQAAAF

这只是无限制地继续。我正在使用iPad进行测试,客户端从appgyver supersonic应用程序(cordova和javascript)中加载。
当使用socket.io聊天示例的分支(修改为集群使用)时,我遇到了相同的问题 - https://github.com/evilstudios/chat-example-cluster 我的问题:为什么有些客户端无法保持连接?如何解决轮询传输不维护单个会话的问题?

我建议您查看服务器端的网络跟踪,了解实际情况。您需要知道客户端是否正在请求WebSocket连接并且随后失去连接,或者客户端和服务器是否不同意升级到WebSocket。所有WebSocket连接都始于HTTP请求,然后双方应该同意升级为持久的WebSocket连接。 - jfriend00
1
但是如果它回退到轮询,它仍然应该基本工作,对吧?例如,连接并保留每个轮询的相同会话ID。 - Horse
首先要做的事情是(正如我在之前的评论中所说)找出网络上实际发生了什么,然后从那里开始。你可以推测会话应该被维持,但是除非你知道网络上实际发生了什么,否则你真的不知道下一步要看什么。 - jfriend00
@Horse 你解决了这个问题吗?我也遇到了同样的问题,但没有得到帮助! - Raptor
@Raptor,虽然已经有一段时间了,但我依稀记得升级(或降级)版本后问题就消失了。如果我没记错的话,当服务器带着现有连接启动时,它并不喜欢这种情况。希望这能帮到你,为了记录,请告诉我们结果 :) - Horse
1
@Horse 谢谢你的回复!我也通过升级到最新版本来解决了这个问题! :) - Raptor
2个回答

1
你需要更新socket.io前后端包,否则会导致传输套接字的故障,前端将使用轮询,因此您将有大量套接字断开连接的情况...
解决方法:更新socket.io前后端包的版本。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接