业余写个moba手游系列之——连上服务器
希望这次的系列文章,我能坚持写完啊…
先交代个背景。之前在A公司作为校招生培训时做了个moba手游,觉得自个当时太年轻,小团队不敢自个内部孵化,就跑去某半成品项目组了,自己的moba也就没继续去做了。现在跳槽到了B公司,B公司规模很大,但是每天也都是业务逻辑为主,而且还是天天敲python。为了不荒废c++以及提升自己的技术栈,准备业余时间重新把这款moba手游搞起来。
服务器用的是A公司的LuaServer(校招时就有源码在手,一直没时间拜读,现在正好结合B公司的技术进行融会贯通下,哈哈哈哈),客户端用的Unity3D。
之前做这款手游时是刚毕业,服务端代码是拿来即用,直接用lua写逻辑,对他们的底层并不了解,2年后,我现在准备重头写一遍,探探其原理,顺便用博客记录记录这个过程,嘿嘿嘿。
之前开发时,Unity那边用的是一个dll库自动连接到LuaServer,现在既然跑到B公司了,也没有那个dll的源码,so,对于Unity那边来说,第一步是要先实现一套与LuaServer配套的rpc网络连接小框架了,为了达到这个目的,我也必须去看看LuaServer的网络是咋写的。。。好了,于是,本文就出来了。
估摸着等整出个完全能用的客户端连接代码还是需要点时日的,不过不着急,毕竟是自个的业余技术项目嘛,哈哈哈。今天从Git上捣鼓了一个c#的网络连接库HiSocket,用这个库作为基础,开始慢慢搭。Git地址,有需要的自取。
OK,改改参数,先连上我的LuaServer再说,客户端基于HiSocket实现了一个连上LuaServer后不断发送自增id的操作,看看LuaServer的后台是否有反应。socket是连接上了,可一直提示包体长度非法是咋回事?按理说,我每次发送一个uint_32的数据,包体再怎么样也不会是67108864啊。。。
2019-04-20 15:46:26,619 INFO CAsioSessionIn.Go - Accepted connection. Remote=127.0.0.1:51370. Session_11.
2019-04-20 15:48:34,403 WARN CAsioSessionBase.Read - Illegal len: 67108864
好了,为了解决这个问题,必须去看源码了。好在2年的服务端工作经验告诉我,对于还没看过源码的,最快debug的方式就是断点调试咯。两边分别断在收发消息的地方。
客户端代码如下:
public void Pack(IByteArray source, Action<byte[]> packedHandler){// Add head length to your message(use int, 4 byte as head)var length = source.Length;var head = BitConverter.GetBytes(length);source.Insert(0, head);// add head bytesvar packed = source.Read(source.Length);packedHandler(packed);}
服务端代码如下:
ReadBuf buf;uint32_t dwLenNet;using namespace boost::asio;boost::system::error_code ec;std::size_t uReadHead = async_read(rSocket,buffer(&dwLenNet, sizeof(dwLenNet)), yield[ec]);// 省略一些逻辑...uint32_t dwLenHost = ntohl(dwLenNet);if (dwLenHost > MAX_DATA_LEN){LOG_WARN_TO("CAsioSessionBase.Read", "Illegal len: " << dwLenHost);return false;}
问题就出在客户端每次明明都是把长度写在了包头,为啥服务器取出来的dwLenHost 值都是异常的呢???捣鼓了半天,总算醒悟过来,服务端的dwLenHost 是调用了ntohl之后的值,也就是说,默认发过来的dwLenNet应该是网络字节序,而我客户端发送的并没有把本地字节转成网络字节,导致两边的行为不一致。。。
找到了问题后就好办了,修改客户端代码为:
public void Pack(IByteArray source, Action<byte[]> packedHandler){// Add head length to your message(use int, 4 byte as head)var length = IPAddress.HostToNetworkOrder(source.Length);var head = BitConverter.GetBytes(length);source.Insert(0, head);// add head bytesvar packed = source.Read(source.Length);packedHandler(packed);}
上面的问题果然顺利解决,此时LuaServer的日志为:
2019-04-20 16:25:59,922 WARN CAsioSessionBase.HandleData - Got illegal RpcPackage, len=4
这提示是RPC数据问题,这现在要是没问题才是大问题呢,由于LuaServer用的都是protobuf作为数据通信协议,下一步客户端就要开始基于protobuf进行数据加工。至此,第一步,连上服务器算是搞定了。
鼓掌~
业余写个moba手游系列之——连上服务器相关推荐
- 战舰世界手游微信登录不上服务器失败,战舰世界闪击战登不进去怎么办?无法连接服务器解决方法...
玩游戏的时候,总是会发生一些意外情况,比如卡帧.建模bug等,不过有时候连游戏都登不进去才让人恼火.在战舰世界闪击战中,很多玩家会出现无法连接服务器的情况,这是怎么回事?战舰世界闪击战登不进去怎么办? ...
- 梦幻西游手游一直连不上服务器,梦幻西游手游进不去怎么办 登陆失败解决方法...
梦幻西游手游首测当前火爆异常,大家都想体验一下当年玩梦幻西游pc客户端时候的感觉.如果遇到梦幻西游手游进不去就尴尬了,万一真进不去怎么办呢?不要急,下面小编给大家带来梦幻西游手游进不去的解决方法. 梦 ...
- MOBA手游《小米超神》案例精讲
原文链接:https://blog.uwa4d.com/archives/2130.html 今天我们为大家带来由福州朱雀网络研发的MOBA手游<小米超神>的UWA测评报告分析.该游戏在不 ...
- 虚荣服务器维护,老牌MOBA手游《虚荣》走入历史,最后的中国服务器即将关闭...
原标题:老牌MOBA手游<虚荣>走入历史,最后的中国服务器即将关闭 如果你还有印象,在<王者荣耀>火红之前,曾有一款手游<虚荣(Vainglory)>吸引了不少玩家 ...
- 剑侠世界2手游怎么在电脑上玩 剑侠世界2安卓模拟器玩法攻略
剑侠世界2手游怎么在电脑上玩呢?<剑侠世界2>是一款3DMMORPG手游,年轻人的国风RPG!他延续<剑侠世界>手游经典,为我们呈现一个荡气回肠的武侠大世界. 二十年剑侠路,两 ...
- 圣墟手游怎么在电脑上玩 圣墟PC版玩法教程
沧海成尘,神启混沌!<圣墟手游>由辰东正版授权并担任监制,盖娅互娱倾力打造的首款逆轮回创世手游.将深度还原小说的热血战斗,大荒宇宙,次世代骨骼动画带来史诗级战斗体验,再现神魔万物并存的磅礴 ...
- 武林外传手游怎么在电脑上玩,武林外传安卓模拟器电脑版教程
武林外传手游可以在电脑上玩吗?武林外传手游是完美世界倾力开发的3D MMORPG手游,目前已经全平台公测了.其实除了在用手机操作武林外传之外,还可以在电脑上鼠标键盘大屏玩.给大家分享一下在电脑上玩武林 ...
- 剑网3手游怎么在电脑上玩 剑网3手游电脑版玩法教程
<剑网3手游>是一款基于<剑网3>深度还原的3D多角色养成MMOARPG.同时也将是西山居研发,在腾讯平台发行的第二款剑侠作品,我们可以在闯荡江湖的过程中结交各路侠士.下面小编 ...
- 剑灵认证服务器系统出错,剑灵手游程序错误怎么办 和服务器断开官方解决
最近剑灵手游放出,想必大家也是期待已久,新作内测会遇到一些bug,最近就有不少玩家游戏的时候发现登录不了,今天小编为大家带来了剑灵手游程序错误怎么办 和服务器断开官方解决,感兴趣的朋友们可以跟着小编去 ...
最新文章
- thinkpad触控笔怎么用_笔记本电脑卡死了怎么办关不了机
- 浅谈ASP.NET 缓存技术
- 开发日记-20190624 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 1
- Java 多线程(四)—— 单例模式
- String str=Hello 与 String str=new String(“Hello”)一样吗?
- java类中声明log对象_用于Android环境,java环境的log打印,可打印任何类型数据
- python网站用什么数据库_使用python读取mysql数据库并进行数据的操作
- Java架构师知识体系汇总
- 适合python组态软件_组态软件心得体会
- C++ VS编译问题--VS下生成DLL,但没有生成Lib的解决办法
- 计算机课签到本,大学课堂点名技术日新月异:电脑摇号扫码上课
- WEBQQ登陆综合帖
- 大气压力换算公式_常用压力单位换算表
- 通信原理第三章:正弦波加窄带高斯噪声
- 关于视频图像dither
- Excel如何复制粘贴筛选后的单元格
- 检查IP或端口是否被封
- canvas粒子线条插件使用
- 【论文精读】Pairwise learning for medical image segmentation
- audioread-支持多种解码 (GStreamer + Core Audio + MAD + FFmpeg) 的python音频解码库
热门文章
- ❤️数据可视化❤️:基于Echarts + GeoJson实现的地图视觉映射散点(气泡)组件【12】 - 湖南省
- 阿里云CDN(内容分发网络)学习笔记day01
- QuickPanel触摸屏维修GE Fanuc触摸屏维修IC754VSI12CTD
- 支付宝被黑客攻击了...
- 在命令框(cmd)中对数据库进行“增删改查”
- 小型,低成本,低功耗一次性无线电设备
- bp学习函数matlab代码,小范学数量经济学之四:BP神经网络预测的MATLAB模拟代码
- 【谷歌浏览器】上传文件卡死、页面另存为文件卡死解决
- 《天天数学》连载61:三月一日
- 5G智慧医疗10大应用场景!