1. 程式人生 > >lidgren 介紹和使用 (三)------ 非同步獲取資訊

lidgren 介紹和使用 (三)------ 非同步獲取資訊

        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  是專門檢測 是否 穿透的。使用起來 更加方便,大家期待下一篇