业余写个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 bytes
		var 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 bytes
        var 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进行数据加工。至此,第一步,连上服务器算是搞定了。
鼓掌~

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页