客户端异步网络通讯_C#、xLua开发经验_xlua 多线程-程序员宅基地

技术标签: c#  unity  lua  游戏开发  

前言:这段时间主要是优化项目的网络底层,由于项目采用的热更方案是xLua+Ab包,业务都是在lua那边,所以一开始用的是luasocket,而且是同步通讯,导致有时等待连接时主线程阻塞,或者要频繁的设置超时,导致性能和体验方面都不好,最后决定使用C#的Socket来写一遍。这篇主要是想分享在写这个xlua和C#Socket的网络底层时遇到的坑。 

 

分析

为什么不继续用luasocket,因为上网查找到关于luasocket的资料和讨论就比较少,而关于luasocket异步的更少,官方例子也不太适用于框架。所以最后打算用C#那边的socket,然后热更修复就用ILRuntime、InjectFix那些。

开发

官方示例

可以先看下微软官方例子:异步客户端套接字示例 | Microsoft Docs

几个关键API:BeginConnect、BeginReceive、BeginSend、EndConnect、EndReceive、EndSend。异步连接、接收、发送,以及对应的结束挂起的异步。

有个点、官方示例中向异步回调中传值是通过最后一个参数传入的

 有可能是避免对主线程的调用?有大佬知道的话可以说一下。

实际开发

1、断线重连:主要是检测心跳包的接收,如果超过一定时间没收到就断线然后重连。

2、断线时没发送的协议重发:可以在发送成功时的回调中返回成功发送的pid或者name用作判断

3、断线重连后之前必须接收的协议的下发:这个有两种情况,比如说登录时有数据模型要初始化,这时就需要有个协议列表,只有在接收完所有协议再进入游戏。 

      还有一种比如说新手引导等系统中,在某系统的必须连续的步骤时中断的情况下,如何保证前端的正常运行,这种的话就需要服务器下发相应的协议,就比方说新手引导,如果是强制性引导的话服务器可以在重连后检测是否有完成了强制性引导,如果没有的话就下发相关的协议。 

4、连接、发送、接收超时的处理:由于是异步 所以SendTimeOut和ReceiveTimeOut不会起作用,如果是断网的情况下会立刻返回抓取到的错误,但是弱网的话可以就要自己去写一个计时了。

5网络下发数据的拼接与处理:这里要重点说一下,上面也有说过因为项目的业务是写在lua里面,所以C#接收到的数据通过xLua传到lua进行处理。

首先实际的数据接收有两种:

一:检测是否有需要接收的字节流,然后抓取(Revice)几个字节进行计算,拿到包头or包体的长度,然后按照长度取出对应的字节数组,再进行解密,往复循环。

 二:检测是否有需要接收的字节流,然后创建一个固定的字节数组进行接收,如果还检测到有剩余的字节流要接收就一直递归,最后再按照一定规则进行解密。

第一种的好处是不用拼接字节,但是需要频繁调用Revice,正常来说调用多次Revice是完全没有问题的,但由于项目中是是lua调C#,而且还是异步接收,所以想稍微避免一下这个问题,所以就采用了第二种方法。

第二种的话需要拼接数据,这里主要是说拼接字节的问题,首先看下xLua的类型映射(XLua官方API 03 类型映射_yhx956058885的博客-程序员宅基地)。

byte[] 对应的是 string,所以一开始我打算是把C#接收到的字节数组传到lua端,然后使用 .. 或者 

table.concat 进行拼接,实际使用后发现拼接后读取里面的其中的字节后,数值一直为0。后面转为在C#端进行拼接,使用了好几种方法进行拼接后都发现拼接后数据错误。最后找到一种可以正常拼接字节数组,并能正常通过xLua传递给lua端。

public List<byte> byteList = new List<byte>();

byteList.AddRange(state.bytes);

byte[] b = byteList.ToArray();

6线程安全

一、先说一个最重要的点,我们知道线程和异步不是同一个东西。但是异步是基于多线程的,所以也会有下述问题在性能优化那章unity官方有说:

可使用 .NET System.Threading.Thread 类在单独的线程上运行繁重的计算。因此可在多核上运行,但请注意,Unity API 不具有线程安全性;您需要缓冲输入和结果,并在主线程上读取和分配它们以便使用 Unity API 调用。

故不能在非主线程的线程上调用Unity的Api。 

二、在实际开发过程中,即使不使用Unity的Api也依然会崩溃,最后在看xLua的GitHub的Issues时,发现在使用多线程时需要加一个 THREAD_SAFE 的宏,其作用是互斥。(这里没找到这个宏的所定义的内容,如果有大佬找到了的话欢迎留言一下)

结语

上述就是在弄这个客户端网络系统时遇到的问题了,主要来说要注意的是两点,一个是字节流的拼接和线程安全。后面如果有时间的话会再研究一下lua的异步。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_47274565/article/details/120330273

智能推荐

Docker----docker-machine安装使用_${docker_machine_name-default}-程序员宅基地

文章浏览阅读259次。docker-machine常用命令总结_${docker_machine_name-default}

opencv 3.0 填充矩形 填充多边形 fillPoly(图像填充)_c++ opencv3 fillpoly-程序员宅基地

文章浏览阅读5.6k次。参考链接:https://blog.csdn.net/billbliss/article/details/43968291_c++ opencv3 fillpoly

python redis连接池_python redis 连接池-程序员宅基地

文章浏览阅读373次,点赞8次,收藏6次。python redis 连接池使用_python redis 连接池

微信番茄钟小程序-程序员宅基地

文章浏览阅读1.4k次。“番茄钟”介绍番茄钟,是根据一个瑞典人所写的番茄工作法理论进行开发的一款方便、实用的日程管理软件。指的是把工作任务分解成半小时左右,集中精力工作25分钟后休息5分钟,如此视作种一个“番茄”,而“番茄工作法”的流程能使下一个30分钟更有动力。使用说明1)开始界面a)开始界面的中央处有倒计时钟,分布在其下的为“工作”与“休息”的两个button,点下任一个button即可触发响应的倒..._番茄时钟微信小程序实验报告

vscode快速生成vue2及vue3模版_vscode创建vue文件模板-程序员宅基地

文章浏览阅读2k次,点赞9次,收藏18次。在中,我们每次新建页面都会需要写一大部分重复代码。那么有什么办法,能够建立模版:vscode是可以进行相关配置的。_vscode创建vue文件模板

Nginx配置https后报错the ssl parameter requires-程序员宅基地

文章浏览阅读5.1k次,点赞4次,收藏5次。1. 报错描述 Nginx配置好Https后启动报错: the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf2. 解决方法进入Nginx安装包执行命令配置Nginx的http和https ./configure --prefix=/usr/l..._the ssl parameter

随便推点

漫谈TCP BBR的收敛动力学(convergence dynamics)_probebw-程序员宅基地

文章浏览阅读4.1k次。如果一个算法的某处说明没有数学支撑,那肯定是不能令人放心的,BBR的收敛性模型从来都是模糊的,不如AIMD那样直接,但还是有一些有意思的动力学过程在里面的。在Neal Cardwell的github里藏着一篇关于BBR收敛动力学的文档 BBR bandwidth-based convergence :https://github.com/google/bbr/commit/c38ae279b67fe1e9b485903daa3f808f7c6e44d4这篇文档的结论是:初始化带宽越小的流在up p_probebw

群晖DSM 6.1:名字不重要,重要的是它在保护你的CASH-程序员宅基地

文章浏览阅读229次。在企业中,数据备份的重要性毋庸置疑,备份不但保护企业重要的资产,当遇到重大事件时,只要数据还在,企业可以很快的恢复到原本状态。虽然数据备份如此重要,却因为备份来源的复杂性——员工电脑、服务器、NAS,再到备份目的地的多元化——本地、异地、云端, 考验企业IT运维的管理能力,也需要企业投入非常多成本才能搭建完整的备份方案。从DSM 6.0开始,我们可以..._active backup和hyper backup区别

listview垂直滚动条效果-程序员宅基地

文章浏览阅读757次。listview垂直滚动条效果 private void Form1_Load(object sender, EventArgs e) { this.listView2.HeaderStyle = System.Windows.For..._c# listview美化竖向滚动条

连接Basler相机_basler连接-程序员宅基地

文章浏览阅读2.8k次。1. 接通电源线和GigE接口网线2. 打开pylon viewer软件,配置IP 打开IP configure界面,方法有以下两种:3. 配置IP将相机的静态IP地址改为与连接的适配器的IP处于同一子网中(即与连接的电脑处于同一子网) 或改为自动获取IP地址。..._basler连接

是什么导致网络服务器变慢?(服务器请求超时)-程序员宅基地

文章浏览阅读169次。最终,要确定服务器速度缓慢的具体原因,对服务器日志、网络流量和系统性能指标进行彻底分析通常很有帮助。与在同一数据中心内发送的请求相比,如果服务器距离访问它的客户端较远,长距离发送的请求可能会遇到更高的延迟。服务器硬件本身可能已经故障或资源不足,这可能包括处理器核心或线程不足、内存或存储容量不足,不能满足处理工作负载的要求。多个应用程序或用户(运行的服务太多或太多用户请求服务)可能会争夺服务器资源,从而导致响应时间变慢并降低整体性能。如果网络流量过载,就会降低服务器处理请求和响应客户端请求的能力。

mysql新建数据表_Mysql创建数据库与表,并添加表的数据-程序员宅基地

文章浏览阅读6k次,点赞5次,收藏15次。首先,在成功安装Mysql的基础上,进入到cmd窗口,登录我们的mysql管理系统。登录方式:mysql -u用户名 -p密码如果出现Welcome to...等一大堆英文指示,则说明成功进入了mysql系统。因为我们不知道系统中有哪些库,所以要使用show databases 命令行,展示有那些库;1.创建数据库与删除CREATE DATABASE数据库名DEFAULT CHARSET='utf..._4、在mysql中创建一个名为shiyandata的数据库,并在数据库创建一个名为jz的数据表,

推荐文章

热门文章

相关标签