数据包不从 Game Maker 分离到 Node,js
Data packets not separating from Game Maker to Node,js
这可能有点长,因为我需要解释一下。
我有一大块数据从 Game Maker 客户端发送到 i 节点服务器应用程序,来自客户端的数据是这样组装的:
//argument0: socket
//argument1: buffer of data
//init
var packetSize = buffer_tell(argument1);
var bufPacket = buffer_create(1, buffer_grow, 1);
//write size, packet into new one
buffer_write(bufPacket, buffer_u8, packetSize + 1);
buffer_copy(argument1, 0, packetSize, bufPacket, 1);
buffer_seek(bufPacket, 0, packetSize + 1);
//send packet
network_send_raw(argument0, bufPacket, buffer_tell(bufPacket));
// destry buffers
buffer_delete(argument1);
buffer_delete(bufPacket);
并从这里发送:
var register_packet = buffer_create(1, buffer_grow, 1);
buffer_write(register_packet, buffer_string, "register");
buffer_write(register_packet, buffer_string, txt_Username.text);
buffer_write(register_packet, buffer_string, txt_Password.text);
network_write(Network.socket, register_packet);
解释为:解释:loginassasa
它应该在哪里解释:login ass asa
解析器代码是:
parse: function(c, data) {
var idx = 0;
while (idx < data.length) {
var packetSize = data.readUInt8(idx);
var extractedPacket = new Buffer(packetSize);
data.copy(extractedPacket, 0, idx, idx + packetSize);
this.interpret(c, extractedPacket);
idx += packetSize;
}
}
和解释函数:
interpret: function(c, datapacket){
var header = PacketModels.header.parse(datapacket);
console.log("Interpret: " + header.command);
switch (header.command.toUpperCase()){
case "LOGIN":
var data = PacketModels.login.parse(datapacket);
User.login(data.username, data.password, function(result, user){
console.log('Login result: ' + result)
if(result){
c.user = user;
c.enterroom(c.user.current_room);
c.socket.write(packet.build(["LOGIN", "TRUE", c.user.current_room, c.user.pos_x, c.user.pos_y, c.user.username]))
}else{
c.socket.write(packet.build(["LOGIN", "FALSE"]))
}
});
break;
case "REGISTER":
var data = PacketModels.register.parse(datapacket);
User.register(data.username, data.password, function(result){
if(result){
c.socket.write(packet.build(["REGISTER", "TRUE"]))
}else{
c.socket.write(packet.build(["REGISTER", "FALSE"]))
}
});
break;
}
它不会删除 header 命令来使大小写切换起作用,
不太确定为什么会失败,我在本地机器上工作得很好,但现在我正在尝试移动到 digital-ocean 云服务器,它似乎无法分解数据包,
任何帮助都会很棒。
提前致谢,
杰夫
原来我从来没有真正解决过这个问题,经过几天的故障排除,服务器似乎没有收到预期格式的数据包,因为这个项目是我自己的,与客户端无关,我不得不把它放在一边继续前进。
我希望有一天能恢复这个项目。
我在 Youtube 上关注这个教程系列,我能够通过在 package.json 中设置较旧的二进制解析器版本来修复错误:
"binary-parser":"1.1.2",
我在同一视频的评论中找到了解决方案。
希望这对您有所帮助。
这可能有点长,因为我需要解释一下。
我有一大块数据从 Game Maker 客户端发送到 i 节点服务器应用程序,来自客户端的数据是这样组装的:
//argument0: socket
//argument1: buffer of data
//init
var packetSize = buffer_tell(argument1);
var bufPacket = buffer_create(1, buffer_grow, 1);
//write size, packet into new one
buffer_write(bufPacket, buffer_u8, packetSize + 1);
buffer_copy(argument1, 0, packetSize, bufPacket, 1);
buffer_seek(bufPacket, 0, packetSize + 1);
//send packet
network_send_raw(argument0, bufPacket, buffer_tell(bufPacket));
// destry buffers
buffer_delete(argument1);
buffer_delete(bufPacket);
并从这里发送:
var register_packet = buffer_create(1, buffer_grow, 1);
buffer_write(register_packet, buffer_string, "register");
buffer_write(register_packet, buffer_string, txt_Username.text);
buffer_write(register_packet, buffer_string, txt_Password.text);
network_write(Network.socket, register_packet);
解释为:解释:loginassasa 它应该在哪里解释:login ass asa
解析器代码是:
parse: function(c, data) {
var idx = 0;
while (idx < data.length) {
var packetSize = data.readUInt8(idx);
var extractedPacket = new Buffer(packetSize);
data.copy(extractedPacket, 0, idx, idx + packetSize);
this.interpret(c, extractedPacket);
idx += packetSize;
}
}
和解释函数:
interpret: function(c, datapacket){
var header = PacketModels.header.parse(datapacket);
console.log("Interpret: " + header.command);
switch (header.command.toUpperCase()){
case "LOGIN":
var data = PacketModels.login.parse(datapacket);
User.login(data.username, data.password, function(result, user){
console.log('Login result: ' + result)
if(result){
c.user = user;
c.enterroom(c.user.current_room);
c.socket.write(packet.build(["LOGIN", "TRUE", c.user.current_room, c.user.pos_x, c.user.pos_y, c.user.username]))
}else{
c.socket.write(packet.build(["LOGIN", "FALSE"]))
}
});
break;
case "REGISTER":
var data = PacketModels.register.parse(datapacket);
User.register(data.username, data.password, function(result){
if(result){
c.socket.write(packet.build(["REGISTER", "TRUE"]))
}else{
c.socket.write(packet.build(["REGISTER", "FALSE"]))
}
});
break;
}
它不会删除 header 命令来使大小写切换起作用, 不太确定为什么会失败,我在本地机器上工作得很好,但现在我正在尝试移动到 digital-ocean 云服务器,它似乎无法分解数据包, 任何帮助都会很棒。 提前致谢, 杰夫
原来我从来没有真正解决过这个问题,经过几天的故障排除,服务器似乎没有收到预期格式的数据包,因为这个项目是我自己的,与客户端无关,我不得不把它放在一边继续前进。 我希望有一天能恢复这个项目。
我在 Youtube 上关注这个教程系列,我能够通过在 package.json 中设置较旧的二进制解析器版本来修复错误:
"binary-parser":"1.1.2",
我在同一视频的评论中找到了解决方案。
希望这对您有所帮助。