Socket.IO 1.2.1和Flash ping超时

我正在使用NodeJS和Socket.IO(v 1.2.1)作为服务器后端和Flash客户端的多玩家游戏。 用Flash我用这个连接到Socket.IO( https://github.com/redannick/FlashSocket.IO/tree/1.0.x )。

我遇到的主要问题是,在10分钟左右的游戏过程中,有些客户端由于ping超时而断开连接。 我做了NodeJS的打印日志,我得到的是:

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控制台中类似的东西:

 pong - 20:23:41 - stop pong - 22:12:8 - start webSocketFatal: Server Timed Out!! 

通常我每个房间有5个玩家,只有2 – 3个玩家可以在同一时间获得。 我的连接代码是:

  _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); 

和服务器代码:

 /** * 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或者为什么发生,我不确定问题是由于闪存引起的。 我试图改变在Flash中的WebSocket库,它仍然发生,我试图更新Socket.IO(我曾经使用1.0.6),它仍然发生。 我也不确定是否因为在另一个选项卡上的游戏发生,并闪烁冻结或什么的。

非常感谢您阅读:)

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

只要设置一个Timer ,每30秒运行一次,然后向服务器发送一条消息(例如string“ping”,但是无关紧要)。

这很常见, 你的代码或设置没有什么特别的错误。