这周开始尝试与后台建立连接了,所以把一个基本的网络请求的探索过程写下来。
首先还是读了下“说明文档”,( http://doc.ulua.org/article/ngui/simpleframework_base4.html ),有四种协议,作为一个有追求的人我当然选择Pbclua这种了。然后就回去框架里面找示例代码了;LuaFramework\Lua\Controller下的PromptCtrl.lua中的请求的代码:
--测试发送PBLUA--
function PromptCtrl.TestSendPblua()
local login = login_pb.LoginRequest();
login.id = 2000;
login.name = 'game';
login.email = '[email protected]';
local msg = login:SerializeToString();
----------------------------------------------------------------
local buffer = ByteBuffer.New();
buffer:WriteShort(Protocal.Message);
buffer:WriteByte(ProtocalType.PB_LUA);
buffer:WriteBuffer(msg);
networkMgr:SendMessage(buffer);
end
代码很容易看明白,调用 login_pb的LoginRequest()方法,传入对应的参数,打包,一顿转换后把包给发出去。往上找很容易找到require的文件:
require "3rd/pblua/login_pb"
找过去是一个lua文件,通过之前的说明文档的了解知道这个是由一个proto的协议文件一顿操作转过来的,而打开对应的proto文件,很明显是定义了一个协议来规定好,请求和返回的方法及之中的参数是什么。那么问题来了,我肯定需要设置一个请求的地址,这里却什么也没有,但是在说明文档有提到,有个网络的管理类(LuaFramework\Scripts\Manager\NetworkManager),不过里面定义了一堆网络处理的方法,没找对。
--login.proto--
message LoginRequest {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}
message LoginResponse {
required int32 id = 1;
}
下一步,我想找到怎么接收的。一顿瞎子操作后,在LuaFramework\Lua\Logic中找到了Network.lua,里面写了接收的方法:
--PBLUA登录--
function Network.TestLoginPblua(buffer)
local protocal = buffer:ReadByte();
local data = buffer:ReadBuffer();
local msg = login_pb.LoginResponse();
msg:ParseFromString(data);
log('TestLoginPblua: protocal:>'..protocal..' msg:>'..msg.id);
end
然后仔细看,这个方法是由上面的function Network.OnMessage(buffer) 来调用的。而OnMessage则是由在Network的Start方法中添加的一个监听事件所调用的。
function Network.Start()
logWarn("Network.Start!!");
Event.AddListener(Protocal.Connect, this.OnConnect);
Event.AddListener(Protocal.Message, this.OnMessage);
Event.AddListener(Protocal.Exception, this.OnException);
Event.AddListener(Protocal.Disconnect, this.OnDisconnect);
end
整个请求和接收的过程就十分明了了,我们可以根据这两处地方的代码来创建所有之后需要进行网络请求的地方。而接收数据的方法是使用的广播机制,我们可以在需要接收数据的地方来添加监听事件来调用对应的方法得到buffer中的数据。
那么AddListener中的Protocal.XXX这个是什么鬼。根据require的路径找到LuaFramework\Lua\Common下的protocal.lua文件,里面定义了一个table装的原来是跟后台定义的接口的信息;
--Buildin Table
Protocal = {
Connect = '101'; --连接服务器
Exception = '102'; --异常掉线
Disconnect = '103'; --正常断线
Message = '104'; --接收消息
Login = '105'; --用户登录
CreateRoom = '1010'; --创建房间
}
所有以后需要使用的接口则都是在这里定义,否则会报错,然后在C#应该也会有一个定义此类接口的地方。(LuaFramework\Scripts\Network中的定义是需要C#中需要用到的接口才定义,否则不用定义,因为网络的请求和接收都是在Lua中完成的,如果C#这边用不到,就不用定义了)。
至于其他的就是小问题了,然后自己慢慢调。我也就调了一天才成功,不过后面照葫芦画瓢就好了。一些接口的东西都是要后台帮忙提供的咯。除了proto文件转lua文件需要自己好好弄一下,而且极为重要,我就是因为没有转好,所以如果有问题的话,你可以尝试重新转一下使用的XXXX_pb.lua,然后就可能好了,能得到数据了,那么,就这样。