您现在的位置是:首页 >学无止境 >unity Sockets通信 使用UDP协议,设置客户端电脑网络配置,使用新线程获取数据,解决卡顿问题,网站首页学无止境
unity Sockets通信 使用UDP协议,设置客户端电脑网络配置,使用新线程获取数据,解决卡顿问题,
简介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;
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。