首页 > 其他分享 >【Unity/网络】Unity和内网穿透的网络测试 —— 以聊天室为例

【Unity/网络】Unity和内网穿透的网络测试 —— 以聊天室为例

时间:2024-08-17 12:22:23浏览次数:6  
标签:name level LogLevel 端口 网络 content Unity NetworkManager 内网

这两天在做那个CodeMonky的胡闹厨房的案例,一直困扰我的是关于Lobby和Relay的相关网络服务,需要挂加速器并且延迟不低,所以我一直在寻找一些其他替代方案,想起来之前做一个UEC++的网络枪战时做过一个内网穿透的方法,所以在Unity中也采用这个方案,但中间怎么改IP和端口都没法连接成功,最后就索性单开了一个项目来测试这一块,现在也算是测出来原因了,这里写个笔记记录下过程

左客户端,右主机端

文章目录

案例概述

首先先说一下写的聊天室案例

使用MessageManager来作为RPC调用,提供全局添加Message方法的单例,其他类可以订阅对应的委托进行自己的处理,比如UI部分可以根据委托创建消息显示

NetworkManager是Unity提供的网络类,配合UnityTransport实现网络的传输和连接的管理

UI部分分三大部分:

  • 第一部分是输入消息内容并发送的部分
  • 第二部分是提供启动Host和Client的按钮部分
  • 第三部分就是消息的生成显示的部分。

关键代码部分

MessageManager

添加消息的RPC部分,该部分只负责转发委托,并不实际存储消息内容,由于一开始是希望方便测试查看网络相关的回调信息,所以添加了一个LogLevel控制消息的颜色,但后来又想不如加个聊天,再后来就成了个聊天室了()

    public void AddMessage(string name, string content, LogLevel level = LogLevel.Normal)
    {
        AddMessageServerRPC(name, content, level);
    }

    [ServerRpc(RequireOwnership = false)]
    private void AddMessageServerRPC(string name, string content, LogLevel level = LogLevel.Normal)
    {
         AddMessageClientRPC(name, content, level);
    }

    [ClientRpc]
    private void AddMessageClientRPC(string name, string content, LogLevel level = LogLevel.Normal)
    {
        onMessageReceived.Invoke(name, content, level);
    }

接下来是在该类中重新在NetworkManager的StartHost和StartClient外面裹一层自己的代码

public void StartHost()
{
    //这一句后面详细解释
    NetworkManager.Singleton.GetComponent<UnityTransport>().SetConnectionData("你的公网IP", 7777, "0.0.0.0");
    
    //提示打印玩家的连接通知
    //Namer.GM是一个名称类,拿来代替直接使用"GM"的字符串方式,方便统一名称,统一修改,查找引用等
    NetworkManager.Singleton.OnClientConnectedCallback += (clientId) =>
    {
        Instance.AddMessage(Namer.GM, "player " + clientId + " Connected.", LogLevel.Warning);

        clientIDList.Add(clientId);
    };

    NetworkManager.Singleton.StartHost();
}

public void StartClient()
{
    NetworkManager.Singleton.OnClientDisconnectCallback += (clientId) =>
    {
        onMessageReceived.Invoke(Namer.GM, "未能成功连接到服务器!", LogLevel.Error);
    };

    NetworkManager.Singleton.StartClient();
}

最后是该类中向外部提供的委托

public UnityAction<string, string, LogLevel> onMessageReceived;

MessageUI

接下来是消息的显示部分,这一部分订阅单例的消息委托并显示出来,注意textPrefab是一个网络物体,其父级要在初始化时就提供。并且要在NetworkManager的NetworkPrefabList中添加该Prefab

public class MessageUI : MonoBehaviour
{
    [SerializeField] private TextBlockUI textPrefab;
    [SerializeField] private Transform textParent;

    private void Start()
    {
        MessageManager.Instance.onMessageReceived += (name, content, level) =>
        {
            TextBlockUI obj = Instantiate(textPrefab, textParent);
            obj.SetText(name, content, level);
        };
    }
}

SendUI

这一部分算是负责发送消息的部分,本质上就是获取消息然后调用写好的函数就行,另外连接Host和Client只需要两个按钮分别调用MessageManager中对应的StartHost和StartClient就行,之后就不写了

public class SendUI : MonoBehaviour
{
    [SerializeField] private TMP_InputField inputField;
    [SerializeField] private TMP_Dropdown dropdown;
    [SerializeField] private Button submitBtn;
    [SerializeField] private TMP_InputField nameField;

    // Start is called before the first frame update
    void Start()
    {
        submitBtn.onClick.AddListener(() =>
        {
            string name = nameField.text;
            string content = inputField.text;
            LogLevel level = (LogLevel)dropdown.value;
            MessageManager.Instance.AddMessage(name, content, level);

            inputField.text = "";
        });

        nameField.onEndEdit.AddListener((str) =>
        {
            PlayerPrefs.SetString("PlayerName", str);
        });
    }
}

上述写完后,在本地进行测试,没问题的话就可以准备进行远程连接了

远程连接

远程连接有许多方案,这里说一下我知道的

  1. Lobby + Relay : 在国内无服务器,连接靠玄学

  2. Unity Online Services:国内的网络服务,相关教程和API可在官网找到,可用,但是免费用户只有五十次房间额度,用完就无了

  3. 内网穿透:直接连接到玩家主机上,花费视使用的软件而定,最经济的办法是内网穿透做服务器然后放云上,或者像我一样直接用来Host连接,不额外搞服务器

内网穿透:

我使用的是路由侠,穿透时都会分配到一个公网的域名和对应端口,其映射到的内网端口通常选为127.0.0.1 : 7777,IP输入本机IP,后面的7777端口只要选一个没其他进程用的即可

确保穿透是打开的,域名对应的IP可以直接在CMD窗口中输入“ping 公网域名”,即可得到IP地址

公网的IP地址和端口填入Unity中NetworkManager下的UnityTransport的Address和Port中,并且打开运行远程连接

到达这一步会发现哪里都正常,但是客户端就是连不上服务器,最主要的一点是监听的端口问题

先打开服务器,再使用CMD,输入netstat -an | find "端口号"可以得到当前端口的状态,一般是

UDP 0.0.0.0:28907 *:*,这说明该端口当前监听所有UDP协议的IP地址连接,主机是正常监听的,

客户端也是连接的公网IP和端口,那么唯一的可能就是主机监听的端口和客户端不一致,客户端使用公网IP和端口进行连接,但最后端口会被映射到内网端口上,因此主机应当监听的是内网的对应端口,所以在StartHost时需要修改监听的端口值,也就是MessageManager中StartHost中的第一段代码

    NetworkManager.Singleton.GetComponent<UnityTransport>().SetConnectionData("你的公网IP", 7777, "0.0.0.0");

自此大功告成,能够通过内网穿透进行通信。

标签:name,level,LogLevel,端口,网络,content,Unity,NetworkManager,内网
From: https://blog.csdn.net/Siro_sama/article/details/141196707

相关文章

  • 【嵌入式开发之网络编程】互联网的基本概念
    计算机网络的定义计算机网络的精确定义并未统一:以功能完善的网络软件及通信协议实现资源共享和信息传递的系统。以传输信息为基本目的,用通信线路和通信设备将多个计算机连接起来的计算机系统的集合。计算机网络的分类 按照网络的作用范围进行分类类别作用范围或距离广域......
  • TCP/UDP网络聊天室
        本博客仅对网络聊天室项目进行分享,仅供学习讨论使用,欢迎大家讨论。UDP网络聊天室项目要求        利用UDP协议,实现一套聊天室软件。服务器端记录客户端的地址,客户端发送消息后,服务器群发给各个客户端软件,服务器也可以自己发送通知给所有客户端。  ......
  • Cisco NX-OS Software Release 10.5(1)F - 网络操作系统软件
    CiscoNX-OSSoftwareRelease10.5(1)F-网络操作系统软件NX-OS网络操作系统请访问原文链接:https://sysin.org/blog/cisco-nx-os-10/,查看最新版。原创作品,转载请保留出处。CiscoNX-OSCiscoNX-OS操作系统助力网络紧跟业务发展步伐。功能和优势NX-OS网络操作系统为现代......
  • 第三章:线性神经网络
    3.1线性回归3.1.1基本元素训练数据集/样本/标签/特征3.1.1.1线性模型一个线性模型有权重,偏移量,权重决定特征对预测值的影响,偏移量则是当特征为0时说明预测值为多少3.1.1.2损失函数损失函数能够量化目标的实际值与预测值之间的差距(损失函数以及部分函数前面的二分之一用......
  • 【网络】UDP回显服务器和客户端的构造,以及连接流程
    回显服务器(EchoServer)最简单的客户端服务器程序,不涉及到业务流程,只是对与API的用法做演示客户端发送什么样的请求,服务器就返回什么样的响应,没有任何业务逻辑,没有进行任何计算或者处理0.构造方法网络编程必须要使用网卡,就需要用到Socket对象创建一个DatagramS......
  • PyTorch--实现循环神经网络(RNN)模型
    文章目录前言完整代码代码解析导入必要的库设备配置超参数设置数据集加载数据加载器定义RNN模型实例化模型并移动到设备损失函数和优化器训练模型测试模型保存模型小改进神奇的报错ValueError:LSTM:Expectedinputtobe2Dor3D,got4Dinstead前言首先,这篇......
  • 2024年第四届网络通信与信息安全国际学术会议(ICNCIS 2024) 2024 4th International Con
    文章目录一、会议详情二、投稿信息三、大会简介四、主讲嘉宾五、征稿主题六、咨询一、会议详情二、投稿信息大会官网:https://ais.cn/u/vEbMBz会议时间:2024年8月23-25日大会地点:中国--杭州终轮截稿:2024年8月19日接受/拒稿通知:投稿后1周内收录检索:EICom......
  • 基于spm实现计算脑簇(Cluster)和大尺度脑网络(Large-Scale Network)的重叠
    前言 在神经科学的处理中,经常会出现想通过大尺度脑网络的视角来分析某一脑区的情形,首先我们要判断簇(Cluster)属于哪个网络,其次我们想要得知量化的信息与某网络的重叠百分比。那拿到Cluster的掩模与脑功能网络的模版后,有哪些方法可以计算重叠比例呢?目录前言一、基于可视......
  • 嵌入式学习DAY32---Linux软件编程---网络编程
    目录一、抓包软件的使用1.1.wireshark         1.作用1.2.UDP包头二、TCP编程2.1.发送信息1.创建套接字2.配置目的对象信息3.将自己的端口和ip和套接字绑定4.建立连接5.发消息6.关闭套接字2.2.接收消息1.创建套接字2.配置自己的信息并将自己的端口和i......
  • Ettercap 是一个用于网络嗅探和中间人攻击的开源工具,主要用于网络安全测试和分析。它
    Ettercap是一个用于网络嗅探和中间人攻击的开源工具,主要用于网络安全测试和分析。它支持多种平台,包括Linux、Windows和macOS。Ettercap可以用来监视、分析、和修改网络流量,通常用于测试和审计网络的安全性。以下是Ettercap的一些主要功能和特点:主要功能嗅探和分析网络......