patternjavascriptMinor
Handling packets in nodejs for MMORPG
Viewed 0 times
handlingpacketsnodejsformmorpg
Problem
Writing a MMORPG server in nodejs, I have to handle packets. These packets have a structure of
So what I did was use a node package called packet
And first get the packet id:
There are packet Id's upto 1000+ which would make my if statements very long. But each packet id contains different data and different ways to handle it.
For example packet 300 which is the handshake packet. It sends the client version to the server and the servers checks it and returns if it is correct or not, if not then client will error wrong version.
the handshake packet is defined as:
My question is, how can I improve this?
So what I did was use a node package called packet
And first get the packet id:
client.on('data', function(data) {
parser.extract("l16 => length, l16 => id", function (packet) {
if (packet.id === 300) {
}
if (packet.id === 301) {
}
if (packet.id === 302) {
}
if (packet.id === 303) {
}
});
// parse the packet id to handle it accordingly
parser.parse(data);
});There are packet Id's upto 1000+ which would make my if statements very long. But each packet id contains different data and different ways to handle it.
For example packet 300 which is the handshake packet. It sends the client version to the server and the servers checks it and returns if it is correct or not, if not then client will error wrong version.
if (packet.id === 300) {
console.log('[recieved] packet:handshake');
parser.extract("handshake", function (packet) {
if (packet.gameClientVer === config.gameClientVer) {
// do stuff
} else {
// do stuff
}
});
// parse structure for packet 300
parser.parse(data);
}
});the handshake packet is defined as:
serializer.packet("handshake", "l16 => length, l16 => id, l16 => gameClientVer, l16 => gameUpdateVer, l16 => gameDateVer");My question is, how can I improve this?
Solution
You should compartmentalize your "handlers" for each of the packets. Each handler should contain a
canHandle method that determines whether it can process the packet and a process method that does the work. Example:var packet300Handler = {
canHandle: function(packet) {
return packet.id === 300;
},
process: function(packet) {
// Do work here.
}
};
var handlers = [packet300Handler, packet301Handler, packet302Handler];
client.on('data', function(data) {
parser.extract('DATA', function(packet) {
for (var i = 0; i < handlers.length; i++) {
var handler = handlers[i];
if (handler.canHandle(packet)) {
handler.process(packet);
break; // Leave loop now that something has handled the packet.
}
}
});
});Code Snippets
var packet300Handler = {
canHandle: function(packet) {
return packet.id === 300;
},
process: function(packet) {
// Do work here.
}
};
var handlers = [packet300Handler, packet301Handler, packet302Handler];
client.on('data', function(data) {
parser.extract('DATA', function(packet) {
for (var i = 0; i < handlers.length; i++) {
var handler = handlers[i];
if (handler.canHandle(packet)) {
handler.process(packet);
break; // Leave loop now that something has handled the packet.
}
}
});
});Context
StackExchange Code Review Q#46013, answer score: 4
Revisions (0)
No revisions yet.