您现在的位置是:首页 >学无止境 >unity Sockets通信 使用UDP协议,设置客户端电脑网络配置,使用新线程获取数据,解决卡顿问题,网站首页学无止境

unity Sockets通信 使用UDP协议,设置客户端电脑网络配置,使用新线程获取数据,解决卡顿问题,

王源骏 2024-07-22 12:01:02
简介unity Sockets通信 使用UDP协议,设置客户端电脑网络配置,使用新线程获取数据,解决卡顿问题,

今天调试和服务器连接,发现始终获取不到服务器的数据,
电脑和服务器都在同一局域网,仍然获取不到,
下面是电脑环境配置,
第一步:
设置网络为专用网络,然后点击配置防火墙和安全设置,关闭防火墙
(点击所连接的wifi的属性)
在这里插入图片描述

第二步:设置出站 入站规则
点击高级设置,入站规则—创建:选择端口—选择UDP,所有本地端口,–允许连接—三个都勾选—起个名字如UDP连接
出站规则 和入站规则操作步骤一样

在这里插入图片描述

在这里插入图片描述

现在运行看看是否已经可以获取服务器数据了,

如果还未获取到,就需要设置自己的IP 地址为固定的了
在这里插入图片描述
然后点击详细信息,拍照记住IPV4地址、IPV4子网掩码。IPv4网关,然后关闭
点击属性
在这里插入图片描述

把刚才记录的东西 按下图以此填写设置,
在这里插入图片描述

//然后在Sockets 通信代码中 绑定的IP 使用自己的IP,
 IPAddress ipAddress = IPAddress.Parse("自己电脑的IP");

下面时UDP代码

using System;
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;
using UnityEngine.Rendering.Universal;
using UnityEngine.UI;



public class ClientHandlerUDP : MonoBehaviour
{
   

    IPAddress ipAddress;
    private const int Port = 服务器端口号;
    static Socket receiverSocket;
    static EndPoint remoteEndPoint;

    Thread thread;
    public void Start()
    {

         设置服务器IP和端口

        string json = CreatFile(Application.streamingAssetsPath + "/IP", "IP.json");//IP地址放到了一个json文件里,方便在其他电脑上配置
        IPClass ip = JsonUtility.FromJson<IPClass>(json);
        
         ipAddress = IPAddress.Parse(ip.ip);
        Debug.Log($"IP和端口号,ip{ip.ip},,,端口号:{Port}");

        StartUpd();


    }
    public void StartUpd()
    {

        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, Port);
        remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
        try
        {
            Debug.Log("创建UDP Socket");
            // 创建UDP Socket
            receiverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);


            Debug.Log($"绑定IP和端口号");
            // 将Socket绑定到本地IP和端口
            receiverSocket.Bind(localEndPoint);
            thread = new Thread(ThreadUpdate);//使用新线程,可以有效防止 获取数据时 运行太卡的问题,
            thread.Start();

            Debug.Log("UDP接收器已启动,等待接收消息...");



        }
        catch (Exception ex)
        {
            Debug.Log(string.Format("发生异常: {0}", ex.Message));
        }
    }


    bool isThreadRunning = true;
    public void ThreadUpdate()
    {
        if (isThreadRunning)
        {
            Debug.Log("线程开启");
            while (true)
            {
                byte[] buffer = new byte[1024];
                Debug.Log("准备接收消息");
                int bytesRead = receiverSocket.ReceiveFrom(buffer, ref remoteEndPoint);

                string message = Encoding.ASCII.GetString(buffer, 0, bytesRead);

                Debug.Log(string.Format("接收到来自 {0} 的消息: {1}", remoteEndPoint.ToString(), message));
               
                Thread.Sleep(1000);
            }
        }

    }
    // 关闭新线程
    private void StopThread()
    {
        // 在主线程中修改标志变量的值
        isThreadRunning = false;
        if (thread == null) return;
        // 等待新线程结束
        thread.Abort();
    }
    public void OnDisable()
    {
        StopThread();
    }
    private string CreatFile(string filePath, string fileName)
    {
        string fullPath = Path.Combine(filePath, fileName);
        if (!Directory.Exists(filePath))
        {
            Directory.CreateDirectory(filePath);
        }
        if (!File.Exists(fullPath))
        {
            FileStream fs1 = new FileStream(fullPath, FileMode.Create);
            fs1.Flush();
            fs1.Close();
        }

        byte[] byets = File.ReadAllBytes(fullPath);
        return Encoding.UTF8.GetString(byets);
    }
}
[Serializable]
public class IPClass
{
    public string ip;
}

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。