之前項目實現了局域網對戰,看見群里有人問,獻丑分享下。
這個局域網對戰功能,在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包,只是系統幫我們實現了。
