NodeJS上多人游戏的TCP套接字处理

时间:2015-11-25 12:51:45

标签: node.js sockets tcp

我有一个多人游戏,我的服务器使用nodejs和TCPSocket(net.createServer)与客户端进行通信。

我有成千上万的客户端连接到服务器,很多人抱怨他们经常与服务器断开连接。

以下是我的服务器现在如何处理连接:

初始化:

var net = require("net"); 
server = net.createServer(function(socket) {
    socket.setTimeout(15000);
    socket.setKeepAlive(true);
    socket.myBuffer = "";
    socket.msgsQue = [];

    socket.on("data", onData); 
    socket.on("error", onError);            
    socket.on("end", onClientDisconnect);
    socket.on("timeout", onClientDisconnect); 
});  
server.listen(port);

发送给客户:

var stringData = JSON.stringify({name:event, message:data});
if (!this.socket.msgsQue || typeof this.socket.msgsQue == "undefined") 
        this.socket.msgsQue = [];

this.socket.msgsQue.unshift(stringData);
var i = this.socket.msgsQue.length;
while(i--) {
    if (this.socket.writable) {
        var elem = this.socket.msgsQue[i];
        this.socket.write(elem+"\0");
        this.socket.msgsQue.splice(i, 1);
     } else {
         //Unable to write at index "i"
         break;//will send the rest on the next attempt
     }
}

断开连接时

var onClientDisconnect = function() {
    this.myBuffer = "";
    delete this.myBuffer;
    this.msgsQue = [];
    delete this.msgsQue;
    this.destroy();
}

从客户接收

    var onData = function(data) {
        if (!data || !data.toString()) return;
        var raw = data.toString();
        this.myBuffer += raw;
        var d_index = this.myBuffer.indexOf('\0'); // Find the delimiter

         // While loop to keep going until no delimiter can be found
        var string;
        while (d_index > -1) {
            // Create string up until the delimiter                 
            string = this.myBuffer.substring(0,d_index);
            // Cuts off the processed chunk          
            this.myBuffer = this.myBuffer.substring(d_index+1); 
            onMessage(string, this);//handle
            // Find the new delimiter
            d_index = this.myBuffer.indexOf('\0'); 
        } 
    }

我注意到的一个问题是msgsQue变得很大,因为套接字不可写,但是不会触发断开处理程序(或稍后雇用..)

您能否就如何优化此建议给我一些建议?

我注意到有时候我会断开连接,但是我可以ping服务器,所以这肯定是与服务器相关的问题。是不是因为服务器本身的负载很高?

(我不想使用socket.io,因为去年我遇到了很多问题,如内存泄漏,冻结服务器应用程序,没有支持等等。)

0 个答案:

没有答案