unity游戏开发-socket网络通信

2023-11-13

本篇主要是分享基于unity的客户端socket网络通信方案。关于服务器的c#-socekt搭建放在了这里《基于C#的Tcp服务端通信》。其中关于socekt粘包断包的处理放在这里分享了《C# socket粘包断包处理》

目录

整体设计

TcpClient

连接建立

消息发送

消息接收

关闭连接

完整代码

TcpClientMgr-业务处理

消息发送

消息接收

心跳和心跳超时

消息等待和超时

完整代码


整体设计

如图所示,一共采用了两层封装来处理整个客户端的逻辑。

首先TcpClient脚本只处理最基础的连接建立,消息的发送和接收。

TcpClientMgr管理和穿件TcpClient。在利用好连接建立,消息收发的基础上再处理业务上的需求:心跳、消息等待、事件传递等。

TcpClient

该层分为四个部分:

  1. 连接建立
  2. 消息发送
  3. 消息接收
  4. 关闭连接

连接建立

连接的创建这块采用的是异步连接Socket.ConnectAsync,并且通过Timer来处理连接超时的情况。

            // 创建套接字
            mClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            
            SocketAsyncEventArgs connectArgs = new SocketAsyncEventArgs();
            connectArgs.UserToken = mClientSocket;
            // 设置ip和端口号
            connectArgs.RemoteEndPoint = new IPEndPoint(IPAddress.Parse(strIP), intPort);
            // 设置完成回调
            connectArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnConnect);
            // 启动异步连接
            mClientSocket.ConnectAsync(connectArgs);

超时的设计是,当开启异步连接的同时创建一定时器,定时器3秒之后执行。执行的内容为关闭连接。若期间连接上了则将定时器任务关闭。

            // 连接超时定时器
            System.Timers.Timer waitTimeOut;  
          
            // 设置超时
            waitTimeOut = new System.Timers.Timer();
            waitTimeOut.AutoReset = false;
            waitTimeOut.Elapsed += OnConnectTimeOut;
            waitTimeOut.Interval = 3000;
            waitTimeOut.Start();

            // 超时处理
            private void OnConnectTimeOut(object sender, System.Timers.ElapsedEventArgs e)
            {
                if (mClientSocket != null && !mClientSocket.Connected)
                {
                    FDebug.LogError("客户端连接超时");
                    Close();
                }
            }

            

连接成功之后就可以开启发送和接收任务了(线程),若连接收到的状态不是Success则执行连接失败的回调方法。

        private void OnConnect(object sender, SocketAsyncEventArgs e)
        {
            // 终止超时设置
            waitTimeOut.Stop();

            if (e.SocketError == SocketError.Success)
            {
                // 开启发送线程
                // 开启接收线程
                // 发送一个连接请求
                SendConnect();
                FDebug.Log("客户端连接成功!");
            }
            else
            {
                FDebug.LogError("客户端连接失败"+e.SocketError.ToString());
                mFnOnConnectFailed?.Invoke((int)e.SocketError);
            }
        }

中间有一个处理是SendConnect(),是给服务器推送一条连接协议。这里面的设计方案是,若服务器收到并返回一个连接协议,才将我们的连接状态标记改为true。

业务层TcpClientMgr的处理都依赖于这个标记为true。主要是为了确保我们的消息接发正常再跑业务逻辑。

消息发送

设置一个消息发送队列

外部只管向队列中放入我们约定的消息结构TcpData

内部开启一个线程不停的从队列中取得数据并通过socket发送出去

关于TcpData的定义可以参考一下这里《基于C#的Tcp服务端通信》


                
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unity游戏开发-socket网络通信 的相关文章

  • function_score组合script_score定制评分结果

    背景 ES版本 6 4 脚本 分两步 过滤掉不关心的数据 加速后续计算分值性能 编写分值脚本 得到最终分值 GET user doc search query function score 过滤掉不关心的数据 加速计算分值性能 query
  • 【表白神器】Python超火隐藏表白图 你能看出来吗?【附源码】

    导语 浪漫至死不渝 温柔绝对屈服 马上国庆了 没啥送的 那就送大家一些表白的代码吧 大兄弟小姐妹们 大家好 我是准时上线更新代码 讲故事的程序媛小姐姐 整理了一款超火的 隐藏表白代码 希望你们喜欢 正文 隐藏表白图 我喜欢你 就像你看不见但
  • 利用sharding-jdbc进行加密解密

    使用前必看 加密后字段不可以进行like查询 加密字段以及涉及的表 代码中需改成小写 数据库表定义也需改成小写 jar包引入 mybatis spring boot starter升级为2 2 2

随机推荐

  • jre替换local_policy.jar和US_export_policy.jar

    JDK1 8 0 151以前版本方法 JDK1 8 0 151的无限制强度加密策略文件变动
  • 【机器视觉系统】基于3DOF机械臂的五子棋机器人(1)

    基于3DOF机械臂的五子棋机器人 文章目录 基于3DOF机械臂的五子棋机器人 1 前言 2 机器视觉系统概述 2 1 机器 2 2 视觉 2 3 系统 3 系统组成概述 3 1 使用工具盘点 3 2 流程图 4 制作步骤建议 5 需要的知识
  • 伤腰的Python爬虫案例,零基础必备实战教程

    目录 前言 开发环境介绍 爬虫案例数据采集一般步骤 1 首先第一步 找到对应的链接地址
  • 三维GIS技术应用

    三维GIS技术应用 背景 以二三维一体化GIS技术为基础框架 进一步拓展二三维一体化数据模型 融合倾斜摄影 BIM 激光点云等多源异构数据 推动三维GIS实现室外室内一体化 宏观微观一体化与空天 地表 地下一体化 赋能全空间的三维GIS应用
  • 北斗短报文遥测终端机在水雨情监测系统中的应用

    一 方案概述 我国水利监管手段比较单一 水雨情监测移动公网覆盖不足等诸多问题 利用北斗短报文通信技术 数字化信息采集技术 实现水文自动测报 大幅度提升湿地生态和水域的监测 查询 预警和应急处理能力 在恶劣天气情况或特殊灾害环境中 通过北斗卫
  • Django 缓存机制 Redis缓存

    Django 提供6种缓存方式 1 开发调式缓存 2 内存缓存 3 文件缓存 4 数据库缓存 5 Memcache缓存 使用Python memcached模块 6 Memcache缓存 使用pylibmc模块 常用的缓存方式是 文件缓存
  • 5g信令流程详解_5G无线网络信令流程

    招个电子工程师 招个电子工程师 一个只专注电子工程师精准招聘的服务 精准 快速 高效 低成本 这是 招个电子工程师 服务的精髓 如果您的技术团队需要扩军 那么 热烈欢迎各大中小企业的HR和招聘负责人与我们联系 具体合作详情请咨询 管理员微信
  • Compose 动画边学边做 - 夏日彩虹

    引言 Compose 在动画方面下足了功夫 提供了种类丰富的 API 但也正由于 API 种类繁多 如果想一气儿学下来 可能会消化不良导致似懂非懂 结合例子学习是一个不错的方法 本文就带大家边学边做 通过高仿微博长按点赞的彩虹动画 学习和实
  • 初学者如何快速练习盲打

    初学者如何快速练习盲打 2012 05 22 15 25 54 转载 标签 打字练习 初学者 手感 杂谈 分类 计算机技巧 盲打要求的是对键盘的熟练 是感觉上的东西 当你看到一句话想到的不应该是每个字有哪个拼音 有那个字母 而是像 手感 一
  • sonar扫描时报Failed to upload report - An error has occurred. Please contact your administrator

    本人新学习使用此软件 参考网络各大神资料后解决问题方法如下 此问题产生的原因在于mysql的max allowed packet 参数限制默认为4M 将设置进行修改就可以了 mysql根据配置文件会限制server接受的数据包大小 有时候大
  • 【应届生必看】技术岗面试应答有哪些话术和技巧?

    很多时候 面试过程中A与B两人工作经历 能力都相差不大时 A能脱颖而出的大部分原因是在面试过程中表现出的较高的情商 稳定性和与企业文化匹配的性格 价值观等 求职者从各项提问中了解面试官想要考察的主旨 根据自己实际情况适当地进行总结和梳理 以
  • Linux操作系统学习,Linux基础命令大全

    目录 第一章 Linux简介和安装 1 1 Linux简介和分类 1 2 安装VMware虚拟机 在虚拟机中安装CentOS 7 第二章 虚拟机中Linux的IP地址配置详解 2 1 什么是IP地址 如何查看 2 2 虚拟机NAT模式中Li
  • JCR分区与中科院分区详解-中科院基础版和升级版详解

    https baijiahao baidu com s id 1642002458698070188 wfr spider for pc JCR分区 科睿唯安每年出版JCR 期刊引用报告 JCR将收录的期刊分为176个不同学科类别 每个学科
  • ubuntu安装NERDTree,Taglist和WinManager

    在ubuntu中要用vim进行开发的话 这三个插件组合在一起 给你一种顺滑的感受 NERDTree NERDTree的安装 nerdtree可以显示当前项目的文件结构 安装方法如下 执行以下命令即可 1 创建文件夹 mkdir vim 如果
  • 线性代数的本质(五)——矩阵的运算

    文章目录 矩阵的运算 矩阵的转置 方阵的运算 初等矩阵 分块矩阵 逆矩阵 矩阵的秩 广义逆矩阵 矩阵的运算 矩阵的转置 转置 矩阵 A A A的行列互换得到的矩阵称为 A A A 的转置 transpose 记作
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】最佳植树距离

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 最佳植树距离 知识点二分查找 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 按照环保公司要求 小明需要在沙化严重的地区进行植树防沙工作 初步目标是种植一条直线的树带
  • git报错:error: RPC failed; curl 18 transfer closed with outstanding read data remaining

    今天和朋友聊天 推荐了个项目给我看看 在克隆的过程中发现太大拉不下来 报错如下 error RPC failed curl 18 transfer closed with outstanding read data remaining 远程
  • 黄金矿工(Java)

    先来一张效果图 图片资源 https pan baidu com s 1weCGFLQlzOTvDRY18bizrg pwd ivjt 提取码 ivjt 该项目一共12个类 均处于同一目录 首先是基类 其余用来表示物体的类都继承它 impo
  • Tensorflow 1.13训练模型.pb文件转换成Tensorflowlite可以使用的.tflite文件过程记录

    Tensorflow 1 13训练模型 pb文件转换成Tensorflowlite可以使用的 tflite文件过程记录 前言 之前一直通过1 13版本的TensorflowGpu训练模型 使用范围局限在电脑端 例如opencv调用模型等等
  • unity游戏开发-socket网络通信

    本篇主要是分享基于unity的客户端socket网络通信方案 关于服务器的c socekt搭建放在了这里 基于C 的Tcp服务端通信 其中关于socekt粘包断包的处理放在这里分享了 C socket粘包断包处理 目录 整体设计 TcpCl