socket通讯

1.c++封装了GameSocket用于和lua封装的Socket交互,GameSocket用了更底层的BaseSocket类进行处理。最终BaseSocket使用苹果的socket库sys/socekt.h进行socket通讯。

(C++对苹果的socket库进行了二次封装,生成一个新的socket类,我们就使用这个socket类。基本步骤就是:1先设置需要连接的IP地址和端口号,同时设置一些连接成功,错误,中断的回调函数,已经连接超时时间等参数。2接下来创建一个新的线程进行socket连接,连接成功,失败或中断都会设置当前的连接状态。连接的同时会创建一个计时器,每桢会根据当前的连接状态进行不同的操作,连接失败或中断则进行重新连接。3连接成功之后在socket成功的状态下执行一个无限循环,在循环当中执行一个recieve的操作,从来接受后端推送的消息,当接受到新的推送后,会更新最新的数据,刚才创建的计时器检测到该数据改变后会调用lua注册在c中的函数执行对应得操作。

客户端也可以调用socket的send函数执行对应发送数据。

因为socket是长连接所以需要确定是否在连接状态,lua 中的 在连接socket成功后 会启动一个定时器,没间隔N秒调用一次socket:send()函数发送心跳包,以确定socket在连接状态,若过N秒后没有得到后端回复则认为断开连接,然后重新连接,若得到后端回复则认为在连接状态,然后启动一下一个定时器N秒后再次发送心跳包。)

2.lua封装的Socket设置IP地址和端口号、设置接收消息的回调函数,设置连接成功,中断,错误等回调函数。进行socket连接[调用栈 Socket:connectServer()->GameSocket::connect()->创建线程GameSocket::tryToConnecion()->GameSocket::connectSync()->BaseSocket::connectServer()

->sys/socket.h中的connect()] 【用到了sys/socket.h的接口connect,connect要传的参数需要经过处理,根据对应的格式】

3.连接成功时:BaseSocket::connectServer()返回true 调用BaseSocket::connectServer()函数 设置当前连接状态。GameSocket在创建时执行一个计时器,每帧根据当前连接状态调用相应的回调函数(成功,中断,失败等)。执行GameSocket::sendSocketStatusToLua()函数->执行lua注册在c++中的lua函数Socket:getSocketStatus(),根据连接状态执行相应操作,设置 连接状态,失败重连等。

4.客户端受数据时:连接成后GameSocket::connectSync()函数内会循环执行BaseSocket::receive函数,BaseSocket::receive()函数内部调用库sys/socket.h的recv()函数用于接收后端到协议传送来的数据,同时存储在recv函数指定的内存中。GameSocket在创建时执行一个计时器GameSocket::gupdate()每帧执行,进行数据分析发现有新数据接收到时,调用GameSocket::onReceiveData回调函数,onReceiveData函数进行数据处理以后(解密,自定义协议混合处理)调用lua注册在c++中的lua函数 Socket:onReceiveData(),根据推送的协议号进行逻辑处理。调用栈:GameSocket::connectSync() while循环调用BaseSocket::receive()->调用库sys/socket.h的recv()同时GameSocket::gupdate()每帧执行->发现有recv()接收的数据后 ->GameSocket::onReceiveData回调函数->lua中的Socket:onReceiveData()函数【用到了sys/socket.h的接口recv()】

5.客户端发送数据时:调用栈:lua函数Socket:send()传内部协议处理过的协议号,数据和相应的keyconfig、config->注册函数lua_cocos2dx_GameSocket_send()->GameSocket::sendToServerFromJsonStr()将参数加密后传到内存中去->GameSocket::sendToServer()->BaseSocket::send( )->库函数sys/socket.h中的send()【用到了sys/socket.h的接口send()】

6.因为socket是长连接所以需要确定是否在连接状态,lua 中的 在连接socket成功后 会启动一个定时器,没间隔N秒调用一次socket:send()函数发送心跳包,以确定socket在连接状态,若过N秒后没有得到后端回复则认为断开连接,然后重新连接,若得到后端回复则认为在连接状态,然后启动一下一个定时器N秒后再次发送心跳包。


https://www.cnblogs.com/wangcq/p/3520400.html

你可能感兴趣的:(socket通讯)