1

这可能有点长,因为我需要解释一下。

我有大量数据从 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 它应该在哪里解释:loginassasa

解析器代码是:

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;
    }

它并没有去除案例切换工作的标题命令,不确定它为什么会失败,我在本地机器上的工作就像一个魅力,但现在我正试图转移到数字海洋云服务器,它似乎无法分解数据包,任何帮助都会很棒。在此先感谢,杰夫

4

2 回答 2

0

我在 Youtube 上关注本教程系列,我能够通过在 package.json 中设置较旧的二进制解析器版本来修复错误:

"binary-parser":"1.1.2",

我在同一个视频的评论中找到了解决方案。

希望这可以帮助。

于 2015-03-27T21:43:19.387 回答
0

事实证明我从来没有真正能够解决这个问题,经过几天的故障排除,服务器似乎没有接收到预期格式的数据包,因为这个项目是我自己的,与客户端无关,我必须设置把这放在一边,继续前进。我希望有一天能恢复这个项目。

于 2015-03-13T15:25:35.830 回答