标签:地址 mes vat 服务 ram socket nbsp 网络 port
没有系统的学习过网络,想做联机游戏还真是费劲,想做在局域网内实现自动搜索服务器的功能,然后就想到了使用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 }
标签:地址 mes vat 服务 ram socket nbsp 网络 port
原文地址:https://www.cnblogs.com/csymaet/p/10004123.html