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;

? ? }

? ? //開(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);

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筛圆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子椿浓,更是在濱河造成了極大的恐慌太援,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扳碍,死亡現(xiàn)場(chǎng)離奇詭異提岔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)笋敞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)唧垦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人液样,你說(shuō)我怎么就攤上這事∏苫梗” “怎么了鞭莽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)麸祷。 經(jīng)常有香客問(wèn)我澎怒,道長(zhǎng),這世上最難降的妖魔是什么阶牍? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任喷面,我火速辦了婚禮,結(jié)果婚禮上走孽,老公的妹妹穿的比我還像新娘惧辈。我一直安慰自己,他們只是感情好磕瓷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布盒齿。 她就那樣靜靜地躺著念逞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪边翁。 梳的紋絲不亂的頭發(fā)上翎承,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音符匾,去河邊找鬼叨咖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛啊胶,可吹牛的內(nèi)容都是我干的甸各。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼创淡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼痴晦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起琳彩,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤誊酌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后露乏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碧浊,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年瘟仿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箱锐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡劳较,死狀恐怖驹止,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情观蜗,我是刑警寧澤臊恋,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站墓捻,受9級(jí)特大地震影響抖仅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜砖第,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一撤卢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梧兼,春花似錦放吩、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瞭稼。三九已至,卻和暖如春腻惠,著一層夾襖步出監(jiān)牢的瞬間环肘,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工集灌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悔雹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓欣喧,卻偏偏與公主長(zhǎng)得像腌零,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唆阿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 面試題 js面試題 __proto__和prototype之間的關(guān)系是什么益涧? 所以的對(duì)象都有__proto__屬性...
    JackOran閱讀 204評(píng)論 0 1
  • 日常學(xué)習(xí)知識(shí)點(diǎn)總結(jié)(JS篇) 1、閉包: 閉包就是函數(shù)中的函數(shù)驯鳖,里面的函數(shù)可以訪問(wèn)外面函數(shù)的變量闲询,外面的變量是內(nèi)部...
    依稀_Sting閱讀 2,058評(píng)論 0 1
  • js新特性之網(wǎng)絡(luò)編程 1.h5新增存儲(chǔ)方案 <!DOCTYPE html> 18-H5新增存...
    煤球快到碗里來(lái)閱讀 379評(píng)論 0 0
  • 基本信息 es6中const定義的屬性是否可以改變? 可以的浅辙,為什么會(huì)這樣呢扭弧?這是由于對(duì)象或者數(shù)組屬于引用數(shù)據(jù)類(lèi)。...
    習(xí)慣就好a閱讀 8,558評(píng)論 0 1
  • JSV5 1记舆、vue 雙向綁定的原理 通過(guò)object.defineProperty()方法來(lái)劫持屬性的gette...
    merlinxu閱讀 1,142評(píng)論 0 1