xy-server/game/network/AgentBase.ts
2025-04-23 09:34:08 +08:00

129 lines
3.6 KiB
TypeScript

import SKDataUtil from "../gear/SKDataUtil";
import SKLogger from "../gear/SKLogger";
import Packet from "./Packet";
import GameConf from "../../conf/GameConf";
let ByteBuffer = require("byte-buffer");
export default class AgentBase {
// PING等待时间 5分钟
static TIME_WAIT_PING: number = 10 * 60 * 1000;
id: number;
socket: WebSocket;
_buffer: any;
lastPing: number;
packet: Packet;
dt: number;
constructor(socket: WebSocket) {
this.id = -1;
this.socket = socket;
this._buffer = new ByteBuffer(1024 * 2);
this.lastPing = 0;
this.packet = new Packet();
}
formatBuffer(buffer: any) {
let bufferArray = Object.keys(buffer).map(function (k) {
return buffer[k];
})
return bufferArray
}
init() {
let list = require('./proto_c');
let self = this;
this.socket.onclose = (event: CloseEvent) => {
if (self.socket) {
self.close();
}
}
this.socket.onopen = (event: Event) => {
}
this.socket.onerror = (event: Event) => {
this.close();
}
// 接受消息
this.socket.onmessage = (event: MessageEvent) => {
this.lastPing = this.dt;
let data = event.data;
if (typeof data == 'string') {
this.onStrMsg(data);
return;
}
try {
let arrbuffer = this.formatBuffer(data);
let buffer = new ByteBuffer(arrbuffer);
let headlen = buffer.readShort();
let msgtype = buffer.readString(headlen);
SKLogger.info(`socket msg:[${msgtype}]`)
let sign = buffer.readString(2)
let func = list[msgtype];
if (func) {
this.packet.setTemplate(msgtype);
buffer = buffer.slice(buffer._index, buffer.byteLength);
let data = this.packet.todata(buffer.toArray());
SKLogger.info(`socket msg data:[${JSON.stringify(data)}]`)
if (GameConf.isAgentLog){
console.log("方法名 = ",func)
console.log("客户端数据 = ",JSON.stringify(data))
}
data = SKDataUtil.fixedLong(data);
func(this, data);
}
buffer = null;
} catch (error) {
SKLogger.warn(`解析错误:${error}\n${error.stack}!`);
}
};
}
onStrMsg(text: string) {
if (text == "ping") {
this.ping();
}
}
send(event: string, obj: any) {
if (this.socket == null || this.socket.readyState != 1) {
return;
}
if (typeof (event) == "string") {
let pack = this.packet;
pack.setTemplate(event);
let buffer = pack.tobuffer(obj);
this.socket.send(buffer);
pack.clean();
} else {
console.warn(`$警告:发送事件必须是字符串`);
}
}
update(dt: number) {
this.dt = dt;
// PING超时
if (this.lastPing != 0 && (this.dt - this.lastPing) > AgentBase.TIME_WAIT_PING) {
SKLogger.debug(`${this.id}心跳超过5分钟断开连接!`);
this.close();
}
}
ping() {
if (this.socket) {
this.socket.send("ping");
}
this.lastPing = this.dt;
}
close() {
if (this.socket) {
this.socket.close();
}
this.socket = null;
}
}