lidgren 介绍和使用 (一)

摘要:
c++有udt,rudp这一类快速稳定不丢包的开源库,c#有人用raknet,不过它不能组播也不能p2p。所以我今天推荐的是lidgren。这个框架国内很少有人用,但它能快速安全udp发送,也能p2p发送。最重要的是相比国内2万一套ESFramework,它是免费的!先来一点我修改后的代码。=null){switch{caseNetIncomingMessageType.StatusChanged:NetConnectionStatusstatus=msg.ReadByte();stringreason=msg.ReadString();Output;ifOutput;UpdateConnectionsList();break;caseNetIncomingMessageType.WarningMessage:caseNetIncomingMessageType.VerboseDebugMessage:stringtext=msg.ReadString();Output;break;caseNetIncomingMessageType.ErrorMessage:caseNetIncomingMessageType.DebugMessage:varstr=msg.ReadString();ifbreak;//we'llgetabunchoftheseandwe'refinewiththatConsole.WriteLine;break;caseNetIncomingMessageType.Data:stringchat=msg.ReadString();Output;Listall=s_server.Connections;//getcopyall.Remove;if{NetOutgoingMessageom=s_server.CreateMessage();om.Write;s_server.SendMessage;}break;caseNetIncomingMessageType.UnconnectedData:Console.WriteLine;break;default:Output;break;}s_server.Recycle;}Thread.Sleep;}}privatestaticvoidOutput{Console.WriteLine;}privatestaticvoidUpdateConnectionsList(){foreach{stringstr=NetUtility.ToHexString+"from"+conn.RemoteEndPoint.ToString()+"["+conn.Status+"]";Output;}}}}这一段是服务器代码,目的就是接收客户端来的消息,并且发送给所以客户端。

有一年多没写东西了,一懒惰就会找借口,今夜擦拭了堆满灰尘的笔记本电脑,插上电源,写了一些代码,时光好像又回到了以前,那个充满梦想的自己。还能回来吗?

好了,废话不多说了,今天主要说说实时通讯,因为手机游戏现在越来越需要这类高速的通信来交互,不然不好玩!c++有udt,rudp这一类快速稳定不丢包的开源库,c#有人用raknet,不过它不能组播也不能p2p。所以我今天推荐的是lidgren 。这个框架国内很少有人用,但它能快速安全udp发送,也能p2p发送。最重要的是 相比国内2万一套ESFramework,它是免费的!

先来一点 我修改后的代码。

usingLidgren.Network;
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Threading.Tasks;

namespacelidgrenwin
{
    classProgram
    {
        private staticNetServer s_server;
        static void Main(string[] args)
        {
            NetPeerConfiguration config = new NetPeerConfiguration("chat");
            config.MaximumConnections = 100;
            config.Port = 14242;
            s_server = newNetServer(config);
            s_server.Start();

            while (true)
            {
                NetIncomingMessage msg;
                while ((msg = s_server.ReadMessage()) != null)
                {
                    switch(msg.MessageType)
                    {
                        caseNetIncomingMessageType.StatusChanged:
                            NetConnectionStatus status =(NetConnectionStatus)msg.ReadByte();

                            string reason =msg.ReadString();
                            Output(NetUtility.ToHexString(msg.SenderConnection.RemoteUniqueIdentifier) + " " + status + ": " +reason);

                            if (status ==NetConnectionStatus.Connected)
                                Output("Remote hail: " +msg.SenderConnection.RemoteHailMessage.ReadString());

                            UpdateConnectionsList();
                            break;
                        caseNetIncomingMessageType.WarningMessage:
                        caseNetIncomingMessageType.VerboseDebugMessage:
                            string text =msg.ReadString();
                            Output(text);
                            break;
                        caseNetIncomingMessageType.ErrorMessage:
                        caseNetIncomingMessageType.DebugMessage:

                            var str =msg.ReadString();
                            if (str.StartsWith("Malformed packet; stated") ||str.StartsWith("Received unhandled library message") ||str.StartsWith("Unexpected NetMessageType"))
                                break; //we'll get a bunch of these and we're fine with that
Console.WriteLine(msg.MessageType + ": " +str);
                            break;
                        caseNetIncomingMessageType.Data:
                            string chat =msg.ReadString();

                            Output("Broadcasting '" + chat + "'");

                            List<NetConnection> all = s_server.Connections; //get copy
all.Remove(msg.SenderConnection);

                            if (all.Count > 0)
                            {
                                NetOutgoingMessage om =s_server.CreateMessage();
                                om.Write(NetUtility.ToHexString(msg.SenderConnection.RemoteUniqueIdentifier) + "said: " +chat);
                                s_server.SendMessage(om, all, NetDeliveryMethod.ReliableOrdered, 0);
                            }
                            break;
                        caseNetIncomingMessageType.UnconnectedData:
                            Console.WriteLine("Received " + msg.LengthBits + "bits of unconnected data");
                            break;
                        default:
                            Output("Unhandled type: " + msg.MessageType + " " + msg.LengthBytes + "bytes " + msg.DeliveryMethod + "|" +msg.SequenceChannel);
                            break;
                    } s_server.Recycle(msg);
                } Thread.Sleep(1);
            }
        }
        private static void Output(stringtext)
        {
            Console.WriteLine(text);
        }
        private static voidUpdateConnectionsList()
        {

            foreach (NetConnection conn ins_server.Connections)
            {
                string str = NetUtility.ToHexString(conn.RemoteUniqueIdentifier) + "from " + conn.RemoteEndPoint.ToString() + "[" + conn.Status + "]";
                Output(str);
            }
        }
    }
}

这一段是 服务器代码,目的就是接收 客户端来的消息,并且发送给所以客户端。

这里面最主要的是switchNetIncomingMessageType以及下面代码,快速有序发送。不丢包

    s_server.SendMessage(om, all, NetDeliveryMethod.ReliableOrdered, 0);

lidgren 介绍和使用 (一)第1张

今天让大家认识一下,从下次开始,我会编写更多的demo和大家讲使用方法,包括unity运用,包括p2p,等等

免责声明:文章转载自《lidgren 介绍和使用 (一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Xamarin.Forms一些常见问题STM32中assert_param的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

博科SAN交换机的状态查询,故障处理等方法(华为SNS系列交换机为例OEM博科)

一、显示交换机的正常运行时间--------------------------------------------------------------------SNS:admin> uptime16:59 up 39 days 6:05, 1 user, load average: 0.04, 0.02, 0.00----------------...

[IT] 关闭笔记本的蜂鸣提示

很久没有写什么了,今天开过workshop, 稍微放松些, 一时动念上来看看,没想到最近一篇都是2010年的了, 不得不感叹时光流逝之快啊. 那就写点什么吧. 现在每天工作用的DELL笔记本,性能差强人意,不过内置的蜂鸣器却有着惊人的大嗓门, windows本来好心设计的操作错误提示音,到这本子上往往是吓人一跳.特别是晚上干活的时候,就更烦人了. 问题可以...

OneNote如何使用

自从安装了Office2013后发现office套件中有很多的好东西,今天要和大家分享的就是Office套件中的OneNote软件,这狂软件能够很方便的记录我们生活中的一些学习资料、一些决绝方法的经验,以及一些代办事项等等,功能很好,并且很实用。我们不用再去安装其他的记事本了,直接使用OneNote就可以。 工具/原料 Office 2013 电脑...

重置 Mac 上的 NVRAM 或 PRAM

https://support.apple.com/zh-cn/HT204063 如果 Mac 出现了与 NVRAM 或 PRAM 中储存的设置有关的问题,那么进行重置可能会有帮助。   NVRAM(非易失性随机访问存储器)是一小部分内存,Mac 使用这些内存来储存某些设置并对其进行快速访问。PRAM(参数 RAM)储存着类似的信息,且 NVRAM 和...

在Windows 10中截取截图的6种方式 简介

在Windows 10中截取截图的6种方式 简介 截图对于不同的目的很重要。它可以用于捕获笔记本电脑上的任何内容的截图。所以,如果你使用Windows 10,你可能不知道如何截图,因为它是比较新的。因此,我们展示了5种方式,您可以屏蔽任何东西,特别是如果您使用Windows 10.这里有6种方式在Windows 10中截取截图。 截图工具 Snippin...

Usb-type-C端口实现的挑战与设计方案

 Usb-type-C端口实现的挑战与设计方案 USB Type-C port implementation challenges and design solutions USB from 1.1 to 3.2 and Beyond 通用串行总线(universal serial bus,USB)于1996年首次推出,它统一了多种不同类型连接的角色,在计...