首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Socket.IO 1.2.1和闪存ping超时

Socket.IO 1.2.1和闪存ping超时
EN

Stack Overflow用户
提问于 2015-01-02 06:49:40
回答 1查看 978关注 0票数 2

我正在制作一个多人游戏使用NodeJS和Socket.IO (v1.2.1)为服务器后端和客户端闪存。对于闪存,我使用它来连接到Socket.IO (https://github.com/redannick/FlashSocket.IO/tree/1.0.x)。

我遇到的主要问题是,在游戏过程中,大约10分钟后,一些客户端由于ping超时而断开连接。我制作了NodeJS打印日志,得到的结果是:

代码语言:javascript
运行
复制
engine:ws writing "3" +0ms
socket.io:client client close with reason ping timeout +40.2m
socket.io:socket closing socket - reason ping timeout +40.2m
socket.io:client ignoring remove for l7G1SDolb60nG3XRAAAA +1ms
User disconnected. Reason: ping timeout

Flash控制台中类似的内容:

代码语言:javascript
运行
复制
pong - 20:23:41 - stop
pong - 22:12:8 - start
webSocketFatal: Server Timed Out!!

通常情况下,我每个房间有5名球员,只有2-3名球员能做到这一点,而且几乎所有人都在同一时间。我的连接代码是:

代码语言:javascript
运行
复制
        _socket = new FlashSocket("http://"+Constants.IP+":"+Constants.PORT);

        // Set up internal events
        _socket.addEventListener(FlashSocketEvent.CONNECT, onConnect);
        _socket.addEventListener(FlashSocketEvent.DISCONNECT, onDisconnect);
        _socket.addEventListener(FlashSocketEvent.MESSAGE, onMessage);
        _socket.addEventListener(FlashSocketEvent.IO_ERROR, onConnectError);
        _socket.addEventListener(FlashSocketEvent.SECURITY_ERROR, onConnectError);
        _socket.addEventListener(FlashSocketEvent.CONNECT_ERROR, onConnectError);
        _socket.addEventListener(FlashSocketEvent.CLOSE, onDisconnect);

        // Set up external events
        _socket.addEventListener(SetUserNameResponse, onSetUserNameResponse);
        _socket.addEventListener(SetLobbyResponse, onSetLobbyResponse);
        _socket.addEventListener(PlayerConnectionEvent, onPlayerConnectionEvent);
        _socket.addEventListener(PlayerDisconnectionEvent, onPlayerDisconnectionEvent);
        _socket.addEventListener(ChatMessageReceived, onChatMessageReceived);
        _socket.addEventListener(IsReady, onIsReady);
        _socket.addEventListener(GoToPhase, onGoToPhase);
        _socket.addEventListener(SendOpinionToVote, onSendOpinionToVote);
        _socket.addEventListener(PlayerVotedOpinion, onPlayerVotedOpinion);
        _socket.addEventListener(AnnouncePhaseResult, onAnnouncePhaseResult);
        _socket.addEventListener(GoToReadyPhase, onGoToReadyPhase);
        _socket.addEventListener(IsCorrupt, onIsCorrupt);
        _socket.addEventListener(AnnouncePhaseResultFinalGame, onAnnouncePhaseResultFinalGame);

和服务器代码:

代码语言:javascript
运行
复制
/**
 * The port we will listen to.
 */
ServerManager.prototype.start = function(server)
{
    this.io = require('socket.io')(
    {
        transports : [ 'flashsocket', 'websocket', 'xhr-polling', 'polling'],
    });

    // Set up connection event
    var _this = this;
    this.io.on('connection', function(socket) { _this.onConnection(socket); });

    // Start the server
    this.io.listen(server);
    console.log("Server listening on port " + this.port);
};


/**
 * Callback for new connections.
 */
ServerManager.prototype.onConnection = function(socket)
{
    console.log("New connection");

    // Set up connection event
    var _this = this;

    socket.on('SUN', function(data) { _this.onSetUserName(socket, data); } );
    socket.on('SL', function(data) { _this.onSetLobby(socket, data); } );
    socket.on('CM_S', function(data) { _this.onSendChatMessage(socket, data); } );
    socket.on('IMR', function(data) { _this.onImReady(socket, data); } );
    socket.on('SOV', function(data) { _this.onSendOpinionVote(socket, data); } );
    socket.on('SCV', function(data) { _this.onSendCaseVote(socket, data); } );
    socket.on('EL', function(data) { _this.onExitLobby(socket, data); } );

    socket.on('disconnect', function(data) { _this.onDisconnect(socket, data); } );
};

我不确定这个问题是由于闪存,由于Socket.IO还是为什么会发生。我尝试在闪存中更改WebSocket库,但它仍然发生,我尝试更新Socket.IO (我过去使用1.0.6),但它仍然发生。我也不确定这是不是因为游戏放在另一个标签上,突然冻结或其他原因造成的。

非常感谢您的阅读:)

EN

回答 1

Stack Overflow用户

发布于 2015-01-02 17:36:44

你只需要一个" keep - alive“消息-一条简单的消息,每X秒从客户端发送到服务器,以保持连接活跃(即,让服务器知道客户端仍在连接)。

只需将Timer设置为每30秒运行一次,然后向服务器发送一条消息(例如,字符串"ping",但这并不重要)。

这是很常见的;您的代码或设置没有什么特别的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27735415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档