2015-01-01 28 views
2

我正在使用NodeJS和Socket.IO(v 1.2.1)爲服務器後端和Flash爲客戶端的多玩家遊戲。用Flash我用這個來連接到Socket.IO(https://github.com/redannick/FlashSocket.IO/tree/1.0.x)。Socket.IO 1.2.1和閃爍ping超時

我遇到的主要問題是,在大約10分鐘後的遊戲過程中,有些客戶端由於ping超時而斷開連接。我做了打印的NodeJS日誌,我得到的是:在Flash控制檯類似

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 

東西:

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),它仍然發生。我也不確定是否因爲在另一個選項卡上進行遊戲而發生閃光凍結或其他事情。

非常感謝您的閱讀:)

回答

1

您簡單需要的「保活」消息 - 這是從客戶端發送到服務器的每X秒,以保持連接一個簡單的信息(即讓服務器知道客戶端仍然連接)。

只需設置一個Timer即可每隔30秒運行一次,並向服務器發送一條消息(例如字符串「ping」,但不要緊)。

這很常見;您的代碼或設置沒有任何特別的錯誤。

+0

btw:「我也不確定是否因爲在另一個選項卡上有遊戲而發生這種情況」 - 如果閃光燈檢測到它失去焦點(即您轉到另一個選項卡),則會自動調節幀速率到5fps之類 - 保持網絡連接和流媒體工作的最低水平。這會影響'Timer'的保真度,所以記住這一點 – divillysausages