有一年多沒寫東西了,一懶惰就會找借口,今夜擦拭了堆滿灰塵的筆記本電腦,插上電源,寫了一些代碼,時光好像又回到了以前,那個充滿夢想的自己。還能回來嗎?
好了,廢話不多說了,今天主要說說 實時通訊,因為手機游戲 現在 越來越 需要 這類高速的通信 來交互,不然不好玩!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,等等
