/************************************************************************ * Copyright (c) 2023 sunking framework * Author : Shao * Mail : yi-shaoye@163.com * Date : 2021-10-28 * Use : 网络模块-客户端基类 ************************************************************************/ import { EventEmitter } from 'events'; import myLogger from '@wingyi8/sk-logger'; import { BaseConnector } from './BaseConnector'; import { RpcTimeout, SocketStatus } from '../util/define'; const logger = myLogger.getLogger('sunking/base/BaseSocket'); export abstract class BaseSocket extends EventEmitter { /** * 服务器对象 */ public connector: BaseConnector; /** * 玩家的唯一标识符 */ public uid: number = 0; /** * 服务器编号 */ public sid: number = 0; /** * 客户端IP */ public clientip: string = ''; /** * 客户端状态 */ protected _status: number = SocketStatus.ST_HEAD; /** * rpc计数器 */ protected rpcId: number = 1; /** * rpc消息队列 */ public rpcRequestMap: Map = new Map(); /** * 超时 */ protected rpcTimeout: number = 5000; /** * 客户端当前状态 */ get status(): SocketStatus { return this._status; } /** * 获取rpc索引 */ protected getRpcId(): number { const id = this.rpcId++; if (this.rpcId > 99999999) { this.rpcId = 1; } return id; } /** * 握手超时计时器 */ protected registerTimer: NodeJS.Timeout = null as any; /** * 心跳超时计时器 */ protected heartbeatTimer: NodeJS.Timeout = null as any; /** * 发送消息 * @param protocol 名字 * @param packet 数据包 */ public abstract sendMessage(packet: any, protocol?: string): void; /** * 广播消息 * @param protocol 协议 * @param packet 数据包 */ public abstract sendToAll(packet: any, protocol?: string): void; /** * 断开连接 * @param code 错误码 * @param message 错误信息 */ public abstract closed(code?: number, message?: string): void; /** * 发包 * @param msg 消息 */ public abstract send(msg: Buffer): void; }