首页 > 其他分享 >Unity 如何设计网络框架

Unity 如何设计网络框架

时间:2023-10-19 13:57:28浏览次数:33  
标签:Socket 框架 网络 TCP Unity 序列化 数据包 连接

在Unity框架设计中与游戏服务器对接的网络框架也是非常重要的一个模块,本文給大家分享如何来基于Unity来设计一个网络框架, 主要的讲解以下几个点:

(1) TCP半包粘包, 长连接与短连接, IO阻塞;

(2) Tcp Socket与UDP Socket 的技术方案;

(3) Unity的序列化与反序列化技术方案;

(4) TCP的封包与拆包;

(5) 基于http的短连接技术方案;

(6) Unity 网络框架设计与实现原理;

 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

TCP半包粘包, 长连接与短连接, IO阻塞

 

TCP 是可靠的网络传送协议,网络传输底层每发送一个TCP数据包,就要等对方确认,收到确认消息以后才能发下一个TCP数据包。当我们在应用层发送一个应用层的数据包的时候,TCP网络底层可能会把这个应用层的数据包分成若干”TCP数据包”,通过网络底层发出去。那么这里就会有一个问题,应用层发的数据包有可能被拆散成几个”TCP数据包”发出去,我们在另外一端接收的时候,可能要把这些拆散的包组合起来。这个就是”半包”。底层有可能把两个应用层的数据包分到一个”TCP数据包”发过去,接收到后,一部分是属于上一个应用层的数据包,一部分属于下一个应用层的数据包,这个叫做”粘包”。

TCP 是面向连接的,服务端与客户端通过TCP 连接来传送数据,如果连接一直在,发送完数据后,不关闭连接,下一次发数据可以直接发送,我们叫做长连接。如果发送数据先建立连接,数据发送完毕后,马上关闭连接,下次要发送数据重新建立连接,这种叫做”短连接”。长连接一直存在,优点就是客户端与服务端随时可以相互通讯,但是一直占用连接资源。短连接是不占用连接资源,但是只有客户端能像服务端发送数据,服务端在断开连接后无法主动通知客户端。

IO阻塞指的是我们的CPU处理数据的速度,远远大于网络的传送速度。当我们要发送数据的时候,CPU调用IO的接口,把数据从内存拷贝到网络底层,等待底层把数据传送过去后,CPU调用的IO函数返回,而这个过程,CPU在等待网络把数据发出去,线程挂起了,这个我们叫做IO阻塞。

 

Tcp Socket与UDP Socket 的技术方案

 

了解完网络的一些基本概念以后,接下来看下使用TCP/UDP Socket用哪些技术方案。Unity其实是作为网络的客户端,而客户端只要去连接服务端与服务器通讯就可以了,不用像服户端同时处理N个客户端的数据传送。所以客户端Socket非常的简单。Unity客户端的Socket我们用哪个插件呢?其实这种完全不需要用什么插件,直接使用OS为我们提供的Socket的相关API就可以了。

TCP Socket 面向连接的,使用流程如下:

1: 客户端Connect服务端,建立Socket连接;

2: 调用Socket的Send函数发送数据;

3: 调用Sokcet Recv函数从Socket上读取数据;

4: 关闭Socket 的连接;

UDP Socket的使用, UDP Socket不是面向连接的,只是调用底层的网络协议,直接把数据包发往特定地址+端口。所以直接是SendTo(网络地址+端口), RecvFrom(网络地址+端口)

TCP/UDP Socket已经足够简单,Unity开发者在选取技术的时候直接使用即可。

 

Unity的序列化与反序列化技术方案

 

网络发送的都是数据字节流,Unity与服务端通讯要把要发送的数据对象变成二进制字节流,然后通过网络传送出去,收到字节流以后,又要重建回数据对象,完成数据发送。数据对象变成二进制字节流这个过程叫序列化,把二进制字节流转回数据对象叫反序列化。

序列化/反序列化目前主要有两个打的方向:一个是二进制序列化,一个是文本序列化;

二进制序列化/反序列化:基于二进制的bit,通过用户商量的协议来把数据对象变成二进制bit数据流,反序列化的时候根据用户协议,来把bit数据流变成数据对象。

文本序列化: 将数据变成人眼可读的文本数据。当收到序列化好的文本数据的时候,根据文本数据的规则来解析出里面的数据重建数据对象。

二进制序列化/反序列化: 我们把一些基本的数据类型用bit来进行编码,如 int, float, string bool等。写好这些基本数据类型的编码和解码的代码, 然后编写要数据对象的协议,然后开发一个编译器,他可以根据这个协议文件,基于基本数据类型的编码/解码函数,根据协议,结合基本数据类型的编码解码,按照对象的结构,拆分成若干基本数据类型,自动生成编码/解码函数代码。

文本序列化的解决方案: json, xml等;

二进制序列化/反序列化解决方案: protobuf;

 

TCP的封包与拆包

 

上面讲解了,应用层的数据包有可能被拆分成若干”TCP数据包”,还有可能两个应用层的数据包连在一起在一个”TCP数据包”中。为了收数据的时候能完整正确的收到应用层的数据包,我们必须要把两个应用层的数据报之间做好分隔标记,当我们收到数据以后就可以根据分隔标记来决定哪些数据是哪个包的。目前有两种做法:

(1) 大小+数据内容+校验码模式;[size][数据body][校验], 游戏开发中经常会使用这种方式来做封包, 收数据的时候,根据大小来将数据包完整的组合出来。WebSocket也是采用的这种方式。

(2) 特定的分割符模式: 123456\r\n67890, Html采用特定的分割符号来拆分数据内容。

 

基于http的短连接技术方案

短连接,前面个讲过的,用完就断开连接,下次要用的时候再重新的连接。短连接是使用TCP Socket策略,而这种策略最常用的就是http(基于TCP Socket+http超文本传输协议)。

Unity网络框架中也要使用http,主要是和服务器对接基于http通讯以及资源服务器的下载等需求。Unity作为客户端,要使用http,都已经封装好了UnityWebRequest,同时UnityWebRequest是多线程模式,可以同时并发N个请求。

 

Unity 网络框架设计与实现原理

 

铺垫了这么多,我们直接来上Unity网络框架的架构设计结构图,供大家参考。

 

这里接收数据的时候,采用多线程来做,收到数据后,进行拆包与反序列化,得到数据对象后,放事件队列,游戏主线程从事件队列里面获取网络事件,然后进行处理。发送数据出去的时候,我们在游戏主线程调用异步的网络Send函数,避免IO阻塞。注意好这些点,就可以设计出一个很好的网络框架。

 

本节分享就到这里了,关注我,学习更多的Unity框架设计的技巧。

标签:Socket,框架,网络,TCP,Unity,序列化,数据包,连接
From: https://www.cnblogs.com/bycw/p/17774515.html

相关文章

  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(10) -- 在Dat
    有时候,一些数据的录入可能需要使用表格直接录入会显得更加方便快捷,这种情况有时候也是由于客户使用习惯而提出,本篇随笔介绍在WPF应用端上使用DataGrid来直接新增、编辑、保存数据的处理。录入数据的时候,我们都采用在一个窗体界面中,根据不同内容进行录入,但是有时候涉及主从表的数......
  • 神经网络基础篇:详解二分类(Binary Classification)
    二分类注:当实现一个神经网络的时候,通常不直接使用for循环来遍历整个训练集(编程tips)举例逻辑回归逻辑回归是一个用于二分类(binaryclassification)的算法。首先从一个问题开始说起,这里有一个二分类问题的例子,假如有一张图片作为输入,比如这只猫,如果识别这张图片为猫,则输出标签......
  • 《动手学深度学习 Pytorch版》 9.4 双向循环神经网络
    之前的序列学习中假设的目标是在给定观测的情况下对下一个输出进行建模,然而也存在需要后文预测前文的情况。9.4.1隐马尔可夫模型中的动态规划数学推导太复杂了,略。9.4.2双向模型双向循环神经网络(bidirectionalRNNs)添加了反向传递信息的隐藏层,以便更灵活地处理此类信息。9......
  • Unity3D 如何制作带厚度的透明图片详解
    Unity3D是一款功能强大的游戏开发引擎,可以实现各种复杂的游戏效果。本文将详细介绍如何使用Unity3D制作带厚度的透明图片,并提供代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。在Unity3D中,......
  • 网络安全应急响应工程师需要具备哪些能力?
    网络安全中细分的工作岗位有很多,除了常见的安全运维工程师、安全服务工程师、渗透测试工程师、网络安全工程师之外,还有代码审计工程师、应急响应工程师等。那么网络安全中什么是应急响应工程师?来看看具体内容介绍。应急响应工程师是网络安全大方向下网络安全与维护岗的一......
  • 网络安全考研院校推荐
    考研预报名开始了大部分院校也出来了考纲本篇文章盘点一下网络空间安全(080911TK)考研院校推荐以下仅供参考,详情可去学校官网查看招生简章2023一志愿录取分数线院校录取最低分录取平均分南昌大学279304河北师范大学271311天津理工大学273298中山大学304357河北大学289......
  • 最新Unity 如何打包发布到Android
    Unity打包Android现在UnityHub已经做的非常好了,可以直接下载对应Unity版本所对应得JDK,NDK,SDK,直接可以通过unityhub下载避免了,各种版本不同导致的编译问题,大大的降低了初学者的打包发布的难度,本文详细讲解UnityAndroid打包以及在打包中间需要理解的点, 如下:(1) Unityhu......
  • 使用 AutoSSH 实现自动化跨网络访问
    AutoSSH是一种用以对SSH登录进行安全地自动化的软件。!比如我们在host2机器上面部署了很多服务,但是由于某种原因导致我们无法直接ssh访问该服务器已经其上服务的对应端口,但是host3服务器,既能够访问host2服务器,又可以访问我们的host1服务器。这是,我们可以通过设置ssh......
  • 《动手学深度学习 Pytorch版》 9.2 长短期记忆网络(LSTM)
    解决隐变量模型长期信息保存和短期输入缺失问题的最早方法之一是长短期存储器(longshort-termmemory,LSTM)。它与门控循环单元有许多一样的属性。长短期记忆网络的设计比门控循环单元稍微复杂一些,却比门控循环单元早诞生了近20年。9.2.1门控记忆元为了记录附加的信息,长短期记......
  • 网络基础
    目录字节序和大小端大小端转换函数IP地址转换字符串到整形小段->大端大端->小端字符串->字符串字节序和大小端字节序,顾名思义字节的顺序,就是大于一个字节类型的数据在内存中的存放顺序,也就是说对于单字符来说是没有字节序问题的,字符串是单字符的集合,因此字符串也没有字节序问......