U3D中使用socket

来源:互联网 发布:南京麒麟网络问坛 编辑:程序博客网 时间:2024/06/06 07:32
  • 在unity开发中,经常会使用到socket
  • 这里记录一下socket使用中遇到的一些状况
  • 在使用socket传输数据的时候,需要考虑到安全性和效率,可以考虑使用把数据加密的方法进行处理,在服务器进行对应解压就好了
  • 对于这个操作流程呢可以写一下:
源数据-压缩-crc校验(添加到消息头)-这里可以添加一个标记位(自己定义就好)-然后获取消息长度添加到消息头(用于在接受时验证是否完整)

先把数据进行压缩,然后把协议编码加到消息头,然后进行crc 校验,然后添加一个是否压缩的标志,最后加上包体总长度,这样构成了一条数据。
这样操作以后的数据,只需要在服务器端进行解密操作就可以了。
接下来就进入了我们的正题,有一定开发经验的游戏开发者一定知道,在网络传输数据的过程中会出现分包粘包的现象,我们首先来说一下什么叫分包、粘包。
  •     分包:传输数据不完整,一条信息被分成多次发送。
比如我们发送了一条信息:“你好”,如果分包现象发生,我们可能只收到了“你”,却没有收到“好”,这样就会导致数据的不完整。
  •     粘包:传输的多条数据粘在一起,比如我发了两句话“你好”和“我是小李”,我们可能会收到“你好我是小李”,也可能收到“你好我是”“你好我”“你好我是小”,后几种情况是分包粘包同时发生,我们肯定不期望这种现象发生,所以我们就有必要对我们发送的数据进行编辑。
解决方案: 我们每发送的一条数据就是一个数据包,我们是通过使用字节流来传输数据的,所以当我们每发送一个数据包,就顺便附带上数据包的长度,这样就形成了“数据包头”+“包体”的结构,包头用来存储数据包长度,包体用来存储具体的数据,每当我们接受数据时,首先读取数据包头,得到数据长度,再和已经传过来的长度对比,如果长度足够,说明至少传过来一个完整的包,我们就可以根据长度来取包体,如果不够,我们先不读取,直到长度满足时,我们再把这条数据进行读取。
  • 这样就能方便的解决分包粘包的问题,但是我们之前接受到的不完整的信息放到哪呢?我们就需要一个缓存区,如果数据不完整,我们先放在缓存,当数据完整时,再取出读取。这里有一种建立缓存区的方案,通过内存流来读取。
    缓存区:我们使用内存流MemoryStream来进行读写操作,如果我们收到数据,我们就将数据写入内存流,当内存流的长度满足包头长度时,就将消息取出读取,流的操作比较基本,可以查阅资料了解,这里只提供一条思路。

  • 考虑到用户掉线以后,服务器不能一直给他返回数据,造成资源的消耗,通常会使用心跳包来检测用户是否活跃。这里介绍一下:
  • 心跳是检验客户端和服务器是否连接、是否断线的非常有效的方法。服务器会每隔一段时间给客户端发送一个心跳包,如果在一定时间内没有收到客户端的回应,即认为客户端已经掉线;同样,如果客户端在一定时间内没 有收到服务器的心跳包,则认为连接不可用。
原创粉丝点击