using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;

public enum EnumStrType
{
     str,
     byte16,
}
public class UdpManager : MonoBehaviour
{
    //private bool getNew = false;
    public EnumStrType strType;
    public static UdpManager _instance;

    //定义客户端通信插口
    Socket socket_c;
    [Header("---------------------客户端--------------------")]
    public string biji = "可以在这里写笔记";


    //服务端
    [Header("存放对方的接收ip")]
    public string oppositeIP = "192.168.2.2";
    [Header("存放对方的接收端口")]
    public int oppositePort = 8888;


    //对方服务端ip端口对
    IPEndPoint oppositeIpEnd;
    //广播的所有ip
    List<string> allIPv4 = new List<string>();

    //定义服务端通信插口
    Socket socket_s;
    [Header("---------------------服务端--------------------")]
    [Header("本机开放的端口")]
    public int selfConnectPoint = 7777;
    // [Header("本机ip自动获取")]
    public static string selfAddress = "";
    //本机服务端所监听的ip端口对
    EndPoint selfListenEnd;
    //监听线程
    Thread connectThread;

    [Header("------------------入站的字符串---------------")]
    public string recvStr;


    //定义接受byte数组的长度
    int recvLen = 0;
    //接收到的byte数据
    byte[] recvData = new byte[1024];
    //要发送的的byte数据
    byte[] sendData = new byte[1024];

    private void Awake()
    {
        _instance = this;
    }
    void Start()
    {
        //string[] tempArr = File.ReadAllLines(Application.streamingAssetsPath + "/配置/IP.txt");

        //oppositeIP = tempArr[1];


        //去除ip 前后空格
        oppositeIP = oppositeIP.Trim();
        //定义本机服务器的ip和端口对
        if (selfAddress == "")
        {
            selfAddress = GetLocalIP();
        }
        selfAddress = selfAddress.Trim();
        GetBroadcastIP(selfAddress);
        //初始化
        InitSocket();
    }
    void InitSocket()
    {
        //作为客户端
        //定义对方的ip和端口对
        oppositeIpEnd = new IPEndPoint(IPAddress.Parse(oppositeIP), oppositePort);
        socket_c = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        //作为服务端    
        //本机服务器监听的ip端口对
        selfListenEnd = new IPEndPoint(IPAddress.Parse(selfAddress), selfConnectPoint);
        socket_s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        socket_s.Bind(selfListenEnd);
        //开启本机服务器监听线程
        connectThread = new Thread(new ThreadStart(SocketReceive));
        connectThread.Start();


        //给目标服务端发送数据测试  
        SocketSendDefault(selfListenEnd.ToString() + ":first");
        print("对方接到表示连接成功");
    }
    

    //本机服务器监听
    public void SocketReceive()
    {
        while (true)
        {
            recvData = new byte[1024];
            recvLen = socket_s.ReceiveFrom(recvData, ref selfListenEnd);
            if(strType == EnumStrType.str)
            {
                recvStr = Encoding.UTF8.GetString(recvData, 0, recvLen);
            }else if(strType == EnumStrType.byte16)
            {
                recvStr = Tool.ToHexStrFromByte(recvData,0,recvLen);
            }
            Debug.Log("信息来自" + selfListenEnd.ToString() + ":" + recvStr);
            //getNew = true;
        }
    }

    //默认ip端口发送
    public void SocketSendDefault(string sendStr)
    {
        //清空
        sendData = new byte[1024];
        //数据转换
        sendData = Encoding.UTF8.GetBytes(sendStr);
        //发送给指定服务端
        socket_c.SendTo(sendData, sendData.Length, SocketFlags.None, oppositeIpEnd);
    }

    //自定义ip端口发送
    public void SocketSendCustom(string sendStr, string ip, int port)
    {
        //清空
        sendData = new byte[1024];
        //数据转换
        sendData = Encoding.UTF8.GetBytes(sendStr);
        IPEndPoint aimIpEnd;

        aimIpEnd = new IPEndPoint(IPAddress.Parse(ip), port);
        //发送给指定服务端
        socket_c.SendTo(sendData, sendData.Length, SocketFlags.None, aimIpEnd);

    }

    //默认ip端口群发
    public void SendToAllDefault(string sendMsg)
    {
        StartCoroutine(SocketBroadcastSend(sendMsg, oppositePort));


    }

    //自定义ip端口群发
    public void SendToAllCustom(string sendMsg, int port)
    {
        StartCoroutine(SocketBroadcastSend(sendMsg, port));

    }
    IEnumerator SocketBroadcastSend(string sendStr, int port)
    {
        //清空
        byte[] sendData_thread = new byte[1024];
        //数据转换
        sendData_thread = Encoding.UTF8.GetBytes(sendStr);
        IPEndPoint aimIpEnd;

        foreach (string ip in allIPv4)
        {
            Debug.Log(ip);
            aimIpEnd = new IPEndPoint(IPAddress.Parse(ip), port);

            socket_c.SendTo(sendData_thread, sendData_thread.Length, SocketFlags.None, aimIpEnd);
        }
        yield return null;
    }


    //连接关闭
    void SocketQuit()
    {
        //关闭线程
        if (connectThread != null)
        {
            connectThread.Interrupt();
            connectThread.Abort();
        }
        //最后关闭socket
        if (socket_c != null)
            socket_c.Close();
        if (socket_s != null)
            socket_s.Close();

        StopAllCoroutines();


    }
    void OnApplicationQuit()
    {
        SocketQuit();
    }

    void Update()
    {
        //if (getNew == true)
        //{
        //    getNew = false;
        //    //执行接收文本事件
        //}


        //if (Input.GetKeyDown(KeyCode.Space))
        //{
        //    SendToAllCustom("hello", 2020);
        //}
    }

    public static string GetLocalIP()
    {
        try
        {
            string HostName = Dns.GetHostName(); //得到主机名
            IPHostEntry IpEntry = Dns.GetHostEntry(HostName);
            for (int i = 0; i < IpEntry.AddressList.Length; i++)
            {
                //从IP地址列表中筛选出IPv4类型的IP地址
                //AddressFamily.InterNetwork表示此IP为IPv4,
                //AddressFamily.InterNetworkV6表示此地址为IPv6类型
                if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
                {
                    Debug.Log(IpEntry.AddressList[i].ToString());
                    return IpEntry.AddressList[i].ToString();
                }
            }
            return "noIp";
        }
        catch
        {
            Debug.Log("ipGetFailed");
            return ("ipGetFailed");
        }

    }


    public void GetBroadcastIP(string ip)
    {
        string[] nums = ip.Split('.');
        string head = nums[0] + "." + nums[1] + "." + nums[2] + ".";
        for (int i = 1; i < 255; i++)
        {

            allIPv4.Add(head + i.ToString());
        }


    }


}




 

using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;

public static class Tool
{
    /// <summary>
    /// 字节数组转16进制字符串:空格分隔
    /// </summary>
    /// <param name="byteDatas"></param>
    /// <returns></returns>
    public static string ToHexStrFromByte(this byte[] byteDatas,int index,int count)
    {
        StringBuilder builder = new StringBuilder();
        for (int i = index; i < count; i++)
        {
            builder.Append(string.Format("{0:X2} ", byteDatas[i]));
        }
        return builder.ToString().Trim();
    }
}
 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐