之前项目实现了局域网对战,看见群里有人问,献丑分享下。
这个局域网对战功能,在PC/web/移动端上实现是一样的,可以通用。
要实现一个游戏的局域网功能,主要实现以下三个功能点:
1.客户端能建立主机服务。
2.其他客户端能自动搜索到该主机
3.其他客户端主动加入该主机。
1. 建立主机服务, 很简单,就不细说了。
2. 实现自动搜索该主机
有几种实现方式:
1.主机用UDP广播向全网段广播自己的地址
当客户端启动时使用UDP协议向255.255.255.255这个广播地址发送广播包,广播包内容包含用户名、工作组、主机名、IP等信息,收到此广播包后,就会在自己的用户列表中添加这个用户的用户名、工作组等信息,同时向对方IP发送本机用户的个人信息;从而双方都能建立起用户列表。
2. 用TCP syn包扫描获取ack。 或者用Udp的ICMP包。其实Udp的ICMP包在某些被屏蔽的情况是无法获得地址的,但我们自己的游戏不存在这个问题。
3. 最简单的一种 见回复内容。
[hide]using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using UnityEngine;
public class PingSocket : MonoBehaviour
{
List<string> ipList = new List<string>();
public void DoGetIP()
{
//Thread
StartCoroutine(getIP());
}
IEnumerator getIP()
{
yield return new WaitForSeconds(1f);
//获取本地机器名
string _myHostName = Dns.GetHostName();
//获取本机IP
string _myHostIP = Dns.GetHostEntry(_myHostName).AddressList[0].ToString();
//截取IP网段
string ipDuan = _myHostIP.Remove(_myHostIP.LastIndexOf('.'));
//string ipDuan = "192.168.0";
//枚举网段计算机
for (int i = 1; i <= 255; i++)
{
System.Net.NetworkInformation.Ping myPing = new System.Net.NetworkInformation.Ping();
myPing.PingCompleted += new PingCompletedEventHandler(_myPing_PingCompleted);
string pingIP = ipDuan + "." + i.ToString();
myPing.SendAsync(pingIP, 500, null);
}
}
void _myPing_PingCompleted(object sender, PingCompletedEventArgs e)
{
if (e.Reply.Status == IPStatus.Success)
{
ipList.Add(e.Reply.Address.ToString());
}
Debugerr.LogJLError("局域网主机---" + e.Reply.Address.ToString());
}
}
其实ping使用的也是ICMP包,只是系统帮我们实现了。
转载于:https://www.cnblogs.com/sundayofit/p/7995470.html