Unity游戏的局域网对战功能实现


   之前项目实现了局域网对战,看见群里有人问,献丑分享下。

    这个局域网对战功能,在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包,只是系统帮我们实现了。
     


      
  
   


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM