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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容