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  是专门检测 是否 穿透的。使用起来 更加方便,大家期待下一篇

posted on 2019-01-10 12:25  太粗难进  阅读(558)  评论(0编辑  收藏  举报