沒有系統的學習過網絡,想做聯機游戲還真是費勁,想做在局域網內實現自動搜索服務器的功能,然后就想到了使用UDP進行廣播,把服務器的信息廣播給每一個玩家。
1 Socket udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 2 int udpPort = 7799; 3 bool isRun = false; 4 5 string broadcastMessage = "房間號|||房間名|||總人數|||人數"; // 要廣播的內容 6 7 public void CreateRoom() 8 { 9 udpSocket.EnableBroadcast = true; // 權限 10 Thread thread_Broadcast = new Thread(Broadcast); 11 thread_Broadcast.Start(); // 啟動線程進行廣播 12 } 13 private void Broadcast() 14 { 15 IPAddress[] ipAddressArr = Dns.GetHostAddresses(Dns.GetHostName()); // 得到本機所有的IP地址 16 List<string> ipPrefixList = new List<string>(); // IP地址前三個部分相同則說明處於同一局域網,所以把所有IP的前三部分存起來,放一個list中 17 foreach (var item in ipAddressArr) 18 { 19 if(item.AddressFamily == AddressFamily.InterNetwork) // 判斷是不是IPV4 20 { 21 string ipPrefix = item.ToString(); 22 int endPointIndex = ipPrefix.LastIndexOf('.'); // 得到最后一個點的位置 23 ipPrefix = ipPrefix.Remove(endPointIndex + 1); // 移除IP的第四部分 24 ipPrefixList.Add(ipPrefix); 25 } 26 } 27 while (isRun) // 不太清楚為什么不管把線程設置成前台線程還是后台線程,在unity編輯里結束游戲的時候,線程都不結束,所以這里使用標志變量來結束 28 { 29 foreach (var item in ipPrefixList) 30 { 31 broadcastMessage = string.Format("{0}|||{1}|||{2}|||{3}", 666,"房間1",8,0); // 格式為"房間號|||房間名|||總人數|||人數"(接收的時候使用string.split解析) 32 byte[] message = Encoding.UTF8.GetBytes(broadcastMessage); 33 udpSocket.SendTo(message, new IPEndPoint(IPAddress.Parse(item+"255"),udpPort));// 255表示廣播地址 34 } 35 Thread.Sleep(1000); // 每一秒廣播一次 36 } 37 private void OnApplicationQuit() 38 { 39 udpSocket.Close(); 40 isRun = false; 41 } 42 }