lidgren 介紹和使用 (一)


有一年多沒寫東西了,一懶惰就會找借口,今夜擦拭了堆滿灰塵的筆記本電腦,插上電源,寫了一些代碼,時光好像又回到了以前,那個充滿夢想的自己。還能回來嗎?

好了,廢話不多說了,今天主要說說 實時通訊,因為手機游戲 現在 越來越 需要 這類高速的通信 來交互,不然不好玩!c++有udt,rudp這一類快速穩定不丟包的 開源庫,c# 有人用raknet,不過它不能組播也不能p2p。所以我今天推薦的是 lidgren 。這個框架 國內很少有人用,但它能快速安全udp發送,也能p2p發送。最重要的是  相比國內2萬一套ESFramework,它是免費的! 

 

 先來一點  我修改后的代碼。

using Lidgren.Network;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace lidgrenwin
{
    class Program
    {
        private static NetServer s_server;
        static void Main(string[] args)
        {
            NetPeerConfiguration config = new NetPeerConfiguration("chat");
            config.MaximumConnections = 100;
            config.Port = 14242;
            s_server = new NetServer(config);
            s_server.Start();

            while (true)
            {
                NetIncomingMessage msg;
                while ((msg = s_server.ReadMessage()) != null)
                {
                    switch (msg.MessageType)
                    {
                        case NetIncomingMessageType.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;
                        case NetIncomingMessageType.WarningMessage:
                        case NetIncomingMessageType.VerboseDebugMessage:
                            string text = msg.ReadString();
                            Output(text);
                            break;
                        case NetIncomingMessageType.ErrorMessage:
                        case NetIncomingMessageType.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;
                        case NetIncomingMessageType.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;
                        case NetIncomingMessageType.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(string text)
        {
            Console.WriteLine(text);
        }
        private static void UpdateConnectionsList()
        {

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

這一段是  服務器代碼,目的就是 接收  客戶端來的消息,並且發送給所以 客戶端。

這里面最主要的是switch  NetIncomingMessageType以及下面代碼,快速有序發送。不丟包

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

今天讓大家認識一下,從下次開始,我會編寫更多的demo和大家講使用方法,包括unity運用,包括p2p,等等


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM