lidgren 介紹和使用 (三)------ 非同步獲取資訊
阿新 • • 發佈:2019-01-10
NetPeerConfiguration config1 = new NetPeerConfiguration("chat");//引數是一個字串標識,前後端一致。 config1.AutoFlushSendQueue = false; // config1.EnableMessageType(NetIncomingMessageType.ConnectionLatencyUpdated);//監聽收發心跳的事件。 s_client = new NetClient(config1); s_client.Start(); SendOrPostCallback m_receiveCallBack = new SendOrPostCallback(OnReceiveMessage);//收發訊息的回撥 s_client.RegisterReceivedCallback(m_receiveCallBack, new SynchronizationContext()); NetOutgoingMessage hail = s_client.CreateMessage("This is the hail message"); s_client.Connect("103.200.30.194", 14242, hail);
public static void OnReceiveMessage(object state) { while (true) { NetIncomingMessage im; while ((im = s_client.ReadMessage()) != null) { // 處理傳入訊息 switch (im.MessageType) {case NetIncomingMessageType.DebugMessage: case NetIncomingMessageType.ErrorMessage: case NetIncomingMessageType.WarningMessage: case NetIncomingMessageType.VerboseDebugMessage: string text = im.ReadString(); Console.WriteLine(text);break; case NetIncomingMessageType.StatusChanged: NetConnectionStatus status = (NetConnectionStatus)im.ReadByte(); if (status == NetConnectionStatus.Connected) Console.WriteLine("當前連線成功"); if (status == NetConnectionStatus.Disconnected) Console.WriteLine("當前連線失敗..."); string reason = im.ReadString(); Console.WriteLine(status.ToString() + "=====: ===========" + reason); break; case NetIncomingMessageType.Data: string chat = im.ReadString(); Console.WriteLine(chat); break; default: Console.WriteLine("Unhandled type: " + im.MessageType + " " + im.LengthBytes + " bytes"); break; } s_client.Recycle(im);//再迴圈中的一個資訊系統 } } }
發現 unity對執行緒支援的不是很好,所以改成非同步方式取得資料。
p2p 原理 網上很多,清楚點做法就 一種,當 2個內網客戶端 傳送伺服器後,知道了 各自 外網ip後,客戶端 相互以 對方 外網 傳送資料。 第一個a傳送者 雖然會被 b路由器阻擋,而沒有被b收到 資料 ,但b路由器 卻記錄了 自己外網ip,那麼b傳送 給a 就可以,同樣,a再次傳送 給b 也可以。
lidgren 有 NetIncomingMessageType.NatIntroductionSuccess 是專門檢測 是否 穿透的。使用起來 更加方便,大家期待下一篇