129 lines
3.6 KiB
TypeScript
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;
|
|
}
|
|
}
|