希望这次的系列文章,我能坚持写完啊…
先交代个背景。之前在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手游系列之——连上服务器相关推荐

  1. 战舰世界手游微信登录不上服务器失败,战舰世界闪击战登不进去怎么办?无法连接服务器解决方法...

    玩游戏的时候,总是会发生一些意外情况,比如卡帧.建模bug等,不过有时候连游戏都登不进去才让人恼火.在战舰世界闪击战中,很多玩家会出现无法连接服务器的情况,这是怎么回事?战舰世界闪击战登不进去怎么办? ...

  2. 梦幻西游手游一直连不上服务器,梦幻西游手游进不去怎么办 登陆失败解决方法...

    梦幻西游手游首测当前火爆异常,大家都想体验一下当年玩梦幻西游pc客户端时候的感觉.如果遇到梦幻西游手游进不去就尴尬了,万一真进不去怎么办呢?不要急,下面小编给大家带来梦幻西游手游进不去的解决方法. 梦 ...

  3. MOBA手游《小米超神》案例精讲

    原文链接:https://blog.uwa4d.com/archives/2130.html 今天我们为大家带来由福州朱雀网络研发的MOBA手游<小米超神>的UWA测评报告分析.该游戏在不 ...

  4. 虚荣服务器维护,老牌MOBA手游《虚荣》走入历史,最后的中国服务器即将关闭...

    原标题:老牌MOBA手游<虚荣>走入历史,最后的中国服务器即将关闭 如果你还有印象,在<王者荣耀>火红之前,曾有一款手游<虚荣(Vainglory)>吸引了不少玩家 ...

  5. 剑侠世界2手游怎么在电脑上玩 剑侠世界2安卓模拟器玩法攻略

    剑侠世界2手游怎么在电脑上玩呢?<剑侠世界2>是一款3DMMORPG手游,年轻人的国风RPG!他延续<剑侠世界>手游经典,为我们呈现一个荡气回肠的武侠大世界. 二十年剑侠路,两 ...

  6. 圣墟手游怎么在电脑上玩 圣墟PC版玩法教程

    沧海成尘,神启混沌!<圣墟手游>由辰东正版授权并担任监制,盖娅互娱倾力打造的首款逆轮回创世手游.将深度还原小说的热血战斗,大荒宇宙,次世代骨骼动画带来史诗级战斗体验,再现神魔万物并存的磅礴 ...

  7. 武林外传手游怎么在电脑上玩,武林外传安卓模拟器电脑版教程

    武林外传手游可以在电脑上玩吗?武林外传手游是完美世界倾力开发的3D MMORPG手游,目前已经全平台公测了.其实除了在用手机操作武林外传之外,还可以在电脑上鼠标键盘大屏玩.给大家分享一下在电脑上玩武林 ...

  8. 剑网3手游怎么在电脑上玩 剑网3手游电脑版玩法教程

    <剑网3手游>是一款基于<剑网3>深度还原的3D多角色养成MMOARPG.同时也将是西山居研发,在腾讯平台发行的第二款剑侠作品,我们可以在闯荡江湖的过程中结交各路侠士.下面小编 ...

  9. 剑灵认证服务器系统出错,剑灵手游程序错误怎么办 和服务器断开官方解决

    最近剑灵手游放出,想必大家也是期待已久,新作内测会遇到一些bug,最近就有不少玩家游戏的时候发现登录不了,今天小编为大家带来了剑灵手游程序错误怎么办 和服务器断开官方解决,感兴趣的朋友们可以跟着小编去 ...

最新文章

  1. thinkpad触控笔怎么用_笔记本电脑卡死了怎么办关不了机
  2. 浅谈ASP.NET 缓存技术
  3. 开发日记-20190624 关键词 读书笔记《Linux 系统管理技术手册(第二版)》DAY 1
  4. Java 多线程(四)—— 单例模式
  5. String str=Hello 与 String str=new String(“Hello”)一样吗?
  6. java类中声明log对象_用于Android环境,java环境的log打印,可打印任何类型数据
  7. python网站用什么数据库_使用python读取mysql数据库并进行数据的操作
  8. Java架构师知识体系汇总
  9. 适合python组态软件_组态软件心得体会
  10. C++ VS编译问题--VS下生成DLL,但没有生成Lib的解决办法
  11. 计算机课签到本,大学课堂点名技术日新月异:电脑摇号扫码上课
  12. WEBQQ登陆综合帖
  13. 大气压力换算公式_常用压力单位换算表
  14. 通信原理第三章:正弦波加窄带高斯噪声
  15. 关于视频图像dither
  16. Excel如何复制粘贴筛选后的单元格
  17. 检查IP或端口是否被封
  18. canvas粒子线条插件使用
  19. 【论文精读】Pairwise learning for medical image segmentation
  20. audioread-支持多种解码 (GStreamer + Core Audio + MAD + FFmpeg) 的python音频解码库

热门文章

  1. ❤️数据可视化❤️:基于Echarts + GeoJson实现的地图视觉映射散点(气泡)组件【12】 - 湖南省
  2. 阿里云CDN(内容分发网络)学习笔记day01
  3. QuickPanel触摸屏维修GE Fanuc触摸屏维修IC754VSI12CTD
  4. 支付宝被黑客攻击了...
  5. 在命令框(cmd)中对数据库进行“增删改查”
  6. 小型,低成本,低功耗一次性无线电设备
  7. bp学习函数matlab代码,小范学数量经济学之四:BP神经网络预测的MATLAB模拟代码
  8. 【谷歌浏览器】上传文件卡死、页面另存为文件卡死解决
  9. 《天天数学》连载61:三月一日
  10. 5G智慧医疗10大应用场景!