通过jsbinding使用多线程异步socket的源码

额,不知道该说些什么,这是用creator以前用cocos2d-js做的,很久没动过了,直到前几天论坛有同学问,我就给了他一份,他好像是能正常使用,本来叫他帮忙写个教程,可是无奈他也忙不过来,我就把源码发上来,想着肯会有同学能用到,我也好久没用过了,很多东西忘了,不过有啥问题可以提问,我能记起的就回答,记不起来的就只有你们自己研究了,还有就是没有进行稳定性测试,当时我用的时候是没问题的

此项目是多线程异步socket,并且是线程安全的

因为是cocos2d-js的项目(我记得好像是cocos2d-js 3.10),所以以前jsbinding的源码可能在creator里有问题,需要的同学可以重新绑定一次cpp源码应该就行了,绑定教程参考

http://forum.cocos.com/t/js-c-jsb-jsbinding/37909

我说我记得的东西啊

大概原理是利用cocos2d的观察者模式,js层监听消息,c++那边收到socket消息后发送消息,js收到消息后通过我自己写的消息队列(写是我自己写的,但是我是抄别人的,网上找的教程,这个消息队列是一本cocos2d教程书籍上的大神写的)取出消息

Message继承自cocos2d的Ref类,原因是我把message当成消息监听里的sender来传送(这些是cocos2d-js的东西,我都忘的差不多了,当初好像是观察者模式不能传递自定义数据,或者是我不知道,或者是其他原因,反正我不会无缘无故去专门声明一个类来存放消息,如果你能搞懂源码你可以自己随便搞,如果搞不懂最好用我现成的:joy:

NetworkMSG类是我自己写的socket收发消息的类,这个你可以自己修改或者重写,我这里用的同步,多线程的方式接收消息

ODSocket是socket库

MTNotificationQueue是线程安全的消息队列,收到c++子线程收到socket消息后,把消息发送给这个消息队列,然后在js层通过这个消息队列取出c++收到的消息

使用方法

c++代码照上面教程绑定(你可以先直接试试看能不能用,能用就不用重新绑定,不能用就照上面教程重新绑定一下),然后放置到相应目录

js层需要监听一个cc.EventListener.CUSTOM消息,这个消息的发送是在NetworkMSG::receiveData()里进行的,然后js层需要在update里调用MTNotificationQueue.getInstance().postNotifications(dt);

这个函数的作用是把消息队列里的消息发送到cocos2d的消息中心(MTNotificationQueue里有两个方法,看似一样,其实一个的方法名带S,一个方法不带S,不带S的方法是把c++收到的消息存放在消息队列里,带S的方法是把消息队列里已有的消息发送到cocos2d的消息队列,放在update里是因为这个消息队列不会主动向cocos2d发送消息,只会在NetworkMSG接收到消息的时候保存到消息队列里,所以需要手动让消息队列往cocos2d发送消息)

ODSocket和MTNotificationQueue都是库,这个应该没什么能修改的,如果你要自己修改,就修改Message和NetworkMSG这两个,因为这两个是我自己写的,你们可以自己随便写,最最最主要的东西就是线程安全,线程安全,线程安全(单线程同步socket当我没说:joy:

哦,还有ODSocket::Create方法里的int iTime=1000是超时时间,好像是等待超时,超时后结束接收消息还是什么的,反正当初没有设置超时的话只能接收第一次socket消息,然后就没反应了,我也不太懂

大概就是这些吧,以下是源码,因为我没有用在creator里,无法贴出详细的使用教程,所以同学们只能拿去自己研究一下,解压出来是cocos2d-js的目录结构,引擎源码太大我删除了,只留下了源码和源码的目录结构,并且c++源码和绑定后的源码都有,如果绑定后的源码不能用,那就用c++源码通过creator里的绑定工具重新绑定一次(什么?你不知道怎么区分c++源码和绑定后的源码?jsb开头的就是绑定后的,没有jsb的就是c++源码:joy:

jsSocket.zip (57.9 KB)

1赞

同时也希望应用到项目并成功使用的同学能写一份详细的使用教程,帮助其他有需要的同学,感激不尽:grin:

1赞

膜拜大神,先關注 :slightly_smiling:

小弟的項目因為用了socket.io,暫時可能不會用到,
若有一天有用到,再來幫大家寫教程,謝謝~~

额, 我真的不是什么大神,只是热心小白(勉强算大白:joy:

mark一下