import { Egg_IfObserver as IfObserver } from "./Egg_IfObserver";
import { Egg_MsgCode as MsgCode} from "../Comm/Egg_MsgCode";
import { msg_def } from "../Protobuf/proto";
import { Egg_ResLogin } from "./Egg_ResLogin";
import { Egg_Tools } from "./Egg_Tools";
import Egg_OfflineArea from "../Others/Egg_OfflineArea";
export class Egg_NetManager
{
? ? m_webSocket : WebSocket;
? ? m_arObservers : Array<IfObserver>;
? ? public static m_bManual : boolean;
? ? public static m_inst;
? ? private static m_resolve : any;
? ? public static get _inst() : Egg_NetManager
? ? {
? ? ? ? if(!this.m_inst)
? ? ? ? {
? ? ? ? ? ? this.m_inst = new Egg_NetManager();
? ? ? ? }
? ? ? ? return this.m_inst;
? ? }
? ? //開(kāi)啟新的連接之前,調(diào)用初始連接信息钓试,此調(diào)用會(huì)關(guān)閉先前的連接
? ? public static Init(ip : string,port : number,bLogin : boolean)
? ? {? ? ?
? ? ? ? let login = bLogin ? "true" : "false";
? ? ? ? cc.sys.localStorage.setItem("ip",ip);
? ? ? ? cc.sys.localStorage.setItem("port",port);? ? ? ?
? ? ? ? cc.sys.localStorage.setItem("login",login);
? ? }
? ? constructor()
? ? {
? ? ? ? let ip : string = cc.sys.localStorage.getItem("ip");
? ? ? ? let port : number = cc.sys.localStorage.getItem("port");? ? ?
? ? ? ? if(ip == null || port == null)
? ? ? ? {
? ? ? ? ? ? console.error("mylog : ip or port is null");
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? this.InitData();? ? ?
? ? ? ? this.InitSocket("ws://" + ip + ":" + port);
? ? }
? ? public IsConnected()
? ? {
? ? ? ? Egg_NetManager.m_resolve = null;
? ? ? ? return new Promise((resolve,reject)=>{
? ? ? ? ? ? Egg_NetManager.m_resolve = resolve;
? ? ? ? });
? ? }
? ? private InitData()
? ? {
? ? ? ? this.m_arObservers = new Array<IfObserver>();
? ? }
? ? private InitSocket(serverIP : string)
? ? {? ? ?
? ? ? ? let strBLogin = cc.sys.localStorage.getItem("login");
? ? ? ? this.m_webSocket = new WebSocket(serverIP);
? ? ? ? this.m_webSocket.binaryType = "arraybuffer";
? ? ? ? this.m_webSocket.onopen = this.OnOpen.bind(this);
? ? ? ? //登錄和普通消息 消息頭不一致玄柠,分開(kāi)處理
? ? ? ? if(strBLogin == "true")
? ? ? ? {? ? ? ? ?
? ? ? ? ? ? this.m_webSocket.onmessage = this.OnMessageForLogin.bind(this);
? ? ? ? }else
? ? ? ? {? ? ? ? ? ?
? ? ? ? ? ? this.m_webSocket.onmessage = this.OnMessage.bind(this);
? ? ? ? }? ? ? ?
? ? ? ? this.m_webSocket.onclose = this.OnClose.bind(this);
? ? ? ? this.m_webSocket.onerror = this.OnError.bind(this);
? ? }
? ? private OnOpen()
? ? {
? ? ? ? Egg_NetManager.m_bManual = false;
? ? ? ? console.log("[連接服務(wù)器成功]");
? ? ? ? if(Egg_NetManager.m_resolve)
? ? ? ? Egg_NetManager.m_resolve(true);
? ? }
? ? private OnMessage(event)
? ? {
? ? ? ? console.log("[服務(wù)器響應(yīng)了]");
? ? ? ? let data = new Uint8Array(event.data);
? ? ? ? if(!data)
? ? ? ? {
? ? ? ? ? ? throw new console.error("event.data is null");
? ? ? ? }
? ? ? ? let msgHeader : msg_def.msg_header = msg_def.msg_header.decode(data);
? ? ? ? console.log("接收到消息 = " + msgHeader.msgId);
? ? ? ? this.NotifyAllObserver(msgHeader.msgId,msgHeader.payload);? ? ? ?
? ? }
? ? //登錄專用消息響應(yīng)轉(zhuǎn)發(fā)
? ? private OnMessageForLogin(event)
? ? {
? ? ? ? console.log("[登錄服務(wù)器響應(yīng)了]");
? ? ? ? let data = new Uint8Array(event.data);? ?
? ? ? ? if(!data)
? ? ? ? {
? ? ? ? ? ? throw new console.error("event.data is null");
? ? ? ? }
? ? ? ? let msgHeader : msg_def.login_msg_header = msg_def.login_msg_header.decode(data);
? ? ? ? this.NotifyAllObserver(msgHeader.msgId,msgHeader.payload);
? ? ? ? console.log("登錄:接收到消息 = " + msgHeader.msgId);
? ? }
? ? private OnClose()
? ? {? ? ?
? ? ? ? console.warn("[連接關(guān)閉]");
? ? ? ? this.m_webSocket = null;
? ? ? ? //連接斷開(kāi)了,點(diǎn)擊任意區(qū)域重新加載
? ? ? ? let offlineArea = cc.find("Canvas/OfflineArea");
? ? ? ? if(offlineArea && !Egg_NetManager.m_bManual)
? ? ? ? {
? ? ? ? ? ? offlineArea.active = true;
? ? ? ? ? ? let ctrl : Egg_OfflineArea = offlineArea.getComponent("Egg_OfflineArea");
? ? ? ? ? ? ctrl.StartCountdown(10);
? ? ? ? }
? ? }
? ? private OnError(event)
? ? {
? ? ? ? console.error("[連接異常]:" + event);
? ? ? ? this.m_webSocket = null;
? ? ? ? if(Egg_NetManager.m_resolve)
? ? ? ? Egg_NetManager.m_resolve(false);
? ? }
? ? //添加網(wǎng)絡(luò)消息觀察者
? ? public AttachObserver(observer : IfObserver)
? ? {? ? ?
? ? ? ? this.m_arObservers.push(observer);
? ? }
? ? //移除觀察者
? ? public DetachObserver(observer : IfObserver)
? ? {
? ? ? ? for(let i = 0;i < this.m_arObservers.length;i++)
? ? ? ? {
? ? ? ? ? ? if(observer == this.m_arObservers[i])
? ? ? ? ? ? {
? ? ? ? ? ? ? ? this.m_arObservers.splice(i,1);
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? //通知觀察者有事件到達(dá)
? ? //注意:場(chǎng)景切換時(shí),會(huì)出現(xiàn)多次附加觀察者的情況篮赢,記得detach釋放
? ? public NotifyAllObserver(msgCode : MsgCode,data : Object)
? ? {
? ? ? ? this.m_arObservers.forEach(item => {
? ? ? ? ? ? if(item)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? item.OnReceive(msgCode,data);
? ? ? ? ? ? }? ? ? ? ?
? ? ? ? });
? ? }
? ? //根據(jù)消息碼發(fā)送(登錄頭不一致,故不可用于登錄,登錄用SendRaw)
? ? public Send(msgCode : MsgCode,st : any,data : any)
? ? {
? ? ? ? let objPayload = null;
? ? ? ? if(data != null)
? ? ? ? {
? ? ? ? ? ? objPayload = st.encode(data).finish();? ? ? ? ? ?
? ? ? ? }? ? ?
? ? ? ? let len = 0;
? ? ? ? if(data != null) len = objPayload.length;
? ? ? ? let msgHeader = msg_def.msg_header.create({
? ? ? ? ? ? msgId : msgCode,
? ? ? ? ? ? playerId : Egg_ResLogin.player_id,
? ? ? ? ? ? token : Egg_ResLogin.token,
? ? ? ? ? ? payloadLen : len,
? ? ? ? ? ? payload : objPayload,
? ? ? ? });
? ? ? ? let objHeader = msg_def.msg_header.encode(msgHeader).finish();
? ? ? ? this.m_webSocket.send(objHeader);
? ? ? ? console.log("mylog 發(fā)送消息 " + msgCode);
? ? }
? ? //原始發(fā)送
? ? public SendRaw(obj : any)
? ? {
? ? ? // console.log("登錄服務(wù)器發(fā)送原始數(shù)據(jù)" + obj);? ?
? ? ? ? this.m_webSocket.send(obj);
? ? }
? ? //發(fā)送http請(qǐng)求
? ? public Get(url : string,cb : CallableFunction,bAsync : boolean = true)
? ? {
? ? ? ? let xhr = cc.loader.getXMLHttpRequest();
? ? ? ? xhr.open("GET",url,bAsync);
? ? ? ? xhr.setRequestHeader("Content-Type","application/json;charset=UTF-8");?
? ? ? ? xhr.onreadystatechange = function () {?
? ? ? ? ? ? if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status <= 207)) {?
? ? ? ? ? ? ? ? cb(true,xhr.responseText);
? ? ? ? ? ? }else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? cb(false,"");
? ? ? ? ? ? }
? ? ? ? };?
? ? ? ? xhr.send();
? ? }
? ? //發(fā)送http請(qǐng)求
? ? public Post(url : string,data : string,cb : CallableFunction,bAsync : boolean = true)
? ? {
? ? ? ? if(data == null) data = "";
? ? ? ? let xhr = cc.loader.getXMLHttpRequest();
? ? ? ? xhr.open("POST",url,bAsync);
? ? ? ? xhr.setRequestHeader("Content-Type","multipart/form-data");?
? ? ? ? xhr.onreadystatechange = function () {?
? ? ? ? ? ? if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status <= 207)) {?
? ? ? ? ? ? ? ? cb(true,xhr.responseText);
? ? ? ? ? ? }else
? ? ? ? ? ? {
? ? ? ? ? ? ? ? cb(false,"");
? ? ? ? ? ? }
? ? ? ? };?
? ? ? ? xhr.send(data);
? ? }
? ? //釋放此網(wǎng)絡(luò)管理器
? ? public Destroy()
? ? {
? ? ? ? let webSocket = Egg_NetManager._inst.m_webSocket;
? ? ? ? if(webSocket)
? ? ? ? {
? ? ? ? ? ? Egg_NetManager.m_bManual = true;
? ? ? ? ? ? webSocket.close();? ? ? ? ? ?
? ? ? ? }
? ? ? ? this.m_webSocket = null;
? ? ? ? Egg_NetManager.m_inst = null;
? ? ? ? cc.sys.localStorage.setItem("ip",null);
? ? ? ? cc.sys.localStorage.setItem("port",null);
? ? ? ? cc.sys.localStorage.setItem("login",null);
? ? }
}