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