Node.js WebSockets客户端-服务器数据包

时间:2019-12-07 11:29:09

标签: node.js websocket buffer

我正在编写一个客户端和服务器,它们显然必须相互配合。在客户端和服务器上,我都有一个用于构造消息的类。这些消息是通过websocket发送的。

现在问题出在我用来构造消息的方法上。我利用Buffer类以及read ... BE函数和write ... BE函数。某种程度上,写在客户端上的数据与服务器上读取的数据不一致。

发送到服务器的消息的一个示例是LOGIN消息:

import ClientMessage from "../../protocol/ClientMessage";
import { LOGIN } from "../../protocol/OpCodes/ClientOpCodes";

export default class RequestLogin extends ClientMessage {
    constructor(username: string, look: string) {
        super(LOGIN);
        this.appendString(username);
        this.appendString(look);
    }
}

操作码中的LOGIN等于1,消息ID应该为1。

接下来,一旦按下登录按钮,将执行以下代码:

this.game.communicationManager.sendMessage(new RequestLogin(username, look));

这是sendMessage函数:

sendMessage(message: ClientMessage) {
    if (this.client.connected) {
        //console.log('Sent [' + message.id + ']: ' + message.constructor.name);
        this.client.send(message.getPacket());
    }
}

最后,这是ClientMessage类:

export default class ClientMessage {
    body: Buffer;
    pos: number;

    constructor(id: number) {
        this.body = Buffer.alloc(512);
        this.pos = 0;

        this.appendShort(id);
    }

    appendShort(i: number) {
        this.body.writeInt16BE(i, this.pos);
        this.pos += 2;
    }

    appendInt(i: number) {
        this.body.writeInt32BE(i, this.pos);
        this.pos += 4;
    }

    appendString(str: string) {
        this.appendShort(str.length);
        this.body.write(str, 'utf8');
        this.pos += str.length + 2;
    }

    getPacket(): string {
        return this.body.toString();
    }
}

(我知道512有点过分,但我认为就阅读而言,这并不重要)。

现在,转到服务器,服务器端的ClientMessage如下所示:

export default class ClientMessage {
    packet: Buffer;
    id: number;
    pos:number;

    constructor(packet:string) {
        this.packet = Buffer.from(packet);
        this.pos = 0;
        this.id = this.getShort();
    }

    getShort(): number {
        const value = this.packet.readInt16BE(this.pos);
        this.pos += 2;
        return value;
    }

    getInt(): number {
        const value = this.packet.readInt32BE(this.pos);
        this.pos += 4;
        return value;
    }

    getString(): string {
        const strlen = this.getShort();
        const value = this.packet.toString('utf8', this.pos, this.pos + strlen);
        this.pos += strlen;
        return value;
    }
}

这是this.ws.on('message'

的回调
onDataArrival(message:string): any {
    const clientMessage:ClientMessage = new ClientMessage(message);
    console.log(clientMessage.id);
    console.log(clientMessage.getString());
}

奇怪的是,该ID已经错误。应该为1的地方(因为LOGIN等于1),clientMessage.id的值是26738,比WAY高。我不确定自己做错了什么或缺少了什么。 (当然,字符串也不正确)

1 个答案:

答案 0 :(得分:0)

已经发现了。问题是客户端的我的appendString。

appendString(str: string) {
    this.appendShort(str.length);
    this.body.write(str, this.pos, 'utf8');
    this.pos += str.length;
}

我必须将字符串写在正确的正确位置。