我正在使用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),它仍然發生。我也不確定是否因爲在另一個選項卡上進行遊戲而發生閃光凍結或其他事情。
非常感謝您的閱讀:)
btw:「我也不確定是否因爲在另一個選項卡上有遊戲而發生這種情況」 - 如果閃光燈檢測到它失去焦點(即您轉到另一個選項卡),則會自動調節幀速率到5fps之類 - 保持網絡連接和流媒體工作的最低水平。這會影響'Timer'的保真度,所以記住這一點 – divillysausages