GameServerModel.ts 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. import { eg } from "../frameWork/eg";
  2. import { GameServerConfig } from "../network/GameServerConfig";
  3. import { HttpClient as HttpClient_Browser, TsrpcError, WsClient as WsClient_Browser } from 'tsrpc-browser';
  4. import { HttpClient as HttpClient_Miniapp, WsClient as WsClient_Miniapp } from 'tsrpc-miniapp';
  5. import { serviceProto as ServiceProtoRoom, ServiceType, ServiceType as ServiceTypeRoom } from "../shared/serviceProto";
  6. import IDataModel from "../frameWork/model/IDataModel";
  7. import UIHelp, { DialogParams } from "../logic/ui/UIHelp";
  8. import GameController from "../GameController";
  9. import { I18n } from "../utils/I18nUtil";
  10. import { NetworkEvent } from "../data/const/EventConst";
  11. import EventMng from "../manager/EventMng";
  12. import GameDataCenter from "../data/GameDataCenter";
  13. import { Code } from "../shared/base";
  14. /** 游戏服 */
  15. export class GameServerModel extends IDataModel {
  16. /** 连接房间服务器 Websocket 客户端 */
  17. wscRoom: WsClient_Miniapp<ServiceTypeRoom> | WsClient_Browser<ServiceTypeRoom> = null!;
  18. /** 重连次数 */
  19. reconnectCnt: number = 0;
  20. async Init(serverUrl: string) {
  21. this.wscRoom = eg.tspcNet.createWscRoom(serverUrl);
  22. }
  23. /** 连接游戏服 */
  24. async Connect() {
  25. let resConnect = await this.wscRoom.connect();
  26. if (!resConnect.isSucc) {
  27. console.error('连接游戏服失败', resConnect.errMsg);
  28. return;
  29. }
  30. CC_PREVIEW && console.log('连接游戏服成功');
  31. this.PostDisconnectFlow();
  32. }
  33. /** 重连游戏服 */
  34. async ReConnect() {
  35. this.reconnectCnt++;
  36. let resConnect = await this.wscRoom.connect();
  37. if (!resConnect.isSucc) {
  38. console.log('连接游戏服失败', resConnect.errMsg);
  39. if (this.reconnectCnt >= GameServerConfig.reconnectMax) {
  40. CC_PREVIEW && console.error("重连服务器超过上限");
  41. let dialogParam: DialogParams = {
  42. content: I18n.getI18nText("http_overtime"),
  43. cbConfirm: () => {
  44. this.reconnectCnt = 0;
  45. GameController.clear();
  46. cc.game.restart();
  47. },
  48. txtConfirm: I18n.getI18nText("http_overtime_confirm_1"),
  49. onlyConfirm: true
  50. }
  51. UIHelp.ShowSystemDialog(dialogParam)
  52. return;
  53. }
  54. setTimeout(() => {
  55. this.ReConnect();
  56. }, 2000);
  57. return;
  58. }
  59. EventMng.emit(NetworkEvent.WAIT, -1)
  60. CC_PREVIEW && console.log("重连服务器成功");
  61. GameDataCenter.login.sendEnterGame(GameDataCenter.login.playerInfo.sid)
  62. }
  63. /** 客户端与服务器断开事件 */
  64. private PostDisconnectFlow() {
  65. this.wscRoom.flows.postDisconnectFlow.push(v => {
  66. // 非客户端手动断开时处理(例:网络错误、服务器关闭)
  67. if (!v.isManual) {
  68. CC_PREVIEW && console.log("wss断线", v.reason);
  69. EventMng.emit(NetworkEvent.WAIT, 1);
  70. this.reconnectCnt = 0;
  71. // 等待 2 秒后自动重连
  72. this.ReConnect();
  73. }
  74. return v;
  75. });
  76. }
  77. /** 错误处理 */
  78. private ErrorHandler(err: TsrpcError) {
  79. if (err) {
  80. UIHelp.ShowTips(err.message);
  81. switch (err.code) {
  82. case Code.fail:
  83. UIHelp.ShowTips(err.message);
  84. break;
  85. }
  86. return null;
  87. }
  88. }
  89. /** 请求api */
  90. public async ReqApi<T extends string & keyof ServiceType['api']>(apiName: T, req: ServiceType['api'][T]['req']) {
  91. let ret = await this.wscRoom.callApi(apiName, req);
  92. if (!ret.isSucc) {
  93. this.ErrorHandler(ret.err)
  94. return null;
  95. }
  96. return ret;
  97. }
  98. /** ws发送消息 */
  99. public SendMsg<T extends string & keyof ServiceType['msg']>(msgName: T, msg: ServiceType['msg'][T]) {
  100. this.wscRoom.sendMsg(msgName, msg);
  101. }
  102. /** 监听消息 */
  103. public ListenMsg<T extends keyof ServiceType['msg']>(msgName: T | RegExp, callback: Function, target: any) {
  104. this.wscRoom.listenMsg(msgName, v => {
  105. callback.call(target, v);
  106. });
  107. }
  108. }