我正在编写一个客户端和服务器,它们显然必须相互配合。在客户端和服务器上,我都有一个用于构造消息的类。这些消息是通过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高。我不确定自己做错了什么或缺少了什么。 (当然,字符串也不正确)
答案 0 :(得分:0)
已经发现了。问题是客户端的我的appendString。
appendString(str: string) {
this.appendShort(str.length);
this.body.write(str, this.pos, 'utf8');
this.pos += str.length;
}
我必须将字符串写在正确的正确位置。