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