我有一个多人游戏,我的服务器使用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,因为去年我遇到了很多问题,如内存泄漏,冻结服务器应用程序,没有支持等等。)