websocket連接示例備份

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;

? ? }

? ? //開啟新的連接之前,調用初始連接信息,此調用會關閉先前的連接

? ? 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);

? ? ? ? //登錄和普通消息 消息頭不一致,分開處理

? ? ? ? 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("[連接服務器成功]");

? ? ? ? if(Egg_NetManager.m_resolve)

? ? ? ? Egg_NetManager.m_resolve(true);

? ? }

? ? private OnMessage(event)

? ? {

? ? ? ? console.log("[服務器響應了]");

? ? ? ? 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);? ? ? ?

? ? }

? ? //登錄專用消息響應轉發(fā)

? ? private OnMessageForLogin(event)

? ? {

? ? ? ? console.log("[登錄服務器響應了]");

? ? ? ? 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("[連接關閉]");

? ? ? ? this.m_webSocket = null;

? ? ? ? //連接斷開了,點擊任意區(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)絡消息觀察者

? ? 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);

? ? ? ? ? ? }

? ? ? ? }

? ? }


? ? //通知觀察者有事件到達

? ? //注意:場景切換時,會出現(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("登錄服務器發(fā)送原始數(shù)據(jù)" + obj);? ?

? ? ? ? this.m_webSocket.send(obj);

? ? }

? ? //發(fā)送http請求

? ? 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請求

? ? 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)絡管理器

? ? 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);

? ? }

}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 面試題 js面試題 __proto__和prototype之間的關系是什么? 所以的對象都有__proto__屬性...
    JackOran閱讀 293評論 0 1
  • 日常學習知識點總結(JS篇) 1、閉包: 閉包就是函數(shù)中的函數(shù),里面的函數(shù)可以訪問外面函數(shù)的變量,外面的變量是內部...
    依稀_Sting閱讀 2,221評論 0 1
  • js新特性之網(wǎng)絡編程 1.h5新增存儲方案 <!DOCTYPE html> 18-H5新增存...
    煤球快到碗里來閱讀 423評論 0 0
  • 基本信息 es6中const定義的屬性是否可以改變? 可以的,為什么會這樣呢?這是由于對象或者數(shù)組屬于引用數(shù)據(jù)類。...
    習慣就好a閱讀 8,722評論 0 1
  • JSV5 1、vue 雙向綁定的原理 通過object.defineProperty()方法來劫持屬性的gette...
    merlinxu閱讀 1,316評論 0 1

友情鏈接更多精彩內容