Cocos2dx 链接Socket服务器

HTTP协议是不断发送请求和答应来实现实时通信的,这种方式非常浪费贷款,又消耗服务器CPU的占用。

而使用Socket(套接字)技术,则可以避免很多无用的请求,客户端跟服务器建立桥梁后就,服务器就可以简单发送信息给客户端,大幅降低了利用HTTP技术时的消耗。

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,是一组接口,所以它并不是一个协议。在设计模式中,Socket是一个门面模式,它把复杂的TCP/IP完全的隐藏了,对用户来说,只要运用这个接口就能完成开发所需。

Socket链接的一般过程有3个步骤:

1、服务器监听:服务器端处于链接等待状态,实时监控网络并等待客户端请求。

2、客户端请求:客户端的套接字提出链接请求(TCP第一次握手),要连接的目标是服务器端的套接字。客户端的套接字必须首先描述它要链接的服务器的套接字,指出其地址和端口号,然后向服务器提出链接请求。

3、链接确认:当服务器套接字监听到客户端套接字的请求时,就会响应客户端的请求,建立新线程并把服务器套接字描述发给客户端(TCP第二次握手),在客户端确认了描述后,双方正式建立连接(TCP第三次握手),而服务器端继续监听其他套接字的请求。

基于传输层的差异,4种不同的Socket:

1*、基于TCP的流套接字:提供给应用层可靠的流式数据服务,使用的协议有BGP、HTTP、FTP、TELNET等。

2*、基于UDP的数据报式套接字:适用于数据传输可靠性要求不高的场合,使用协议有:RIP、SNMP、L2TP。

3、基于rawip的原始套接字:非连接,数据传输不可靠,但可以使应用层直接访问网络层。

4、基于链路层的链路层套接字:费链接,数据传输不可靠,为IS-IS协议提供的套接字接口,使协议可以直接访问链路层。

更多关于Socket的介绍可以百度一下。

如何在Cocos2dx使用Socket:

为了使用Socket协议,我们首先要从了解SocketIO::SIODelegate类开始,它是一个代理类,他为下面的SIOClient类代理了5个处理事件的虚函数。

virtual void onConnect(cocos2d::network::SIOClient* client); //当打开socket连接时会调用这个函数

virtual void onMessage(cocos2d::network::SIOClient* client,const std::string& data);  //当接收到数据时会调用这个函数

virtual void onClose(cocos2d::network::SIOClient* client);  //当socket关闭时会调用这个函数

virtual void onError(cocos2d::network::SIOClient* client,const std::string&data);  //当链接错误时会调用这个函数

virtual void fireEventToScript(cocos2d::network::SIOClient* client,const std::String& eventName,const std::string& data); //当SIOClient对象接收到发送事件信号时转发到脚本层。

SIOClient client 是连接的SIOClient对象   data是传送过来的信息    eventName是事件名称

由于版本的更新,前三个函数已经被废弃,三个事件在新版中会以"connect","message","close"时间触发。

SIOClient类的方法 增加对其了解:

SIOClient(const std::string& host,int port,const std::string& path,SIOClientimpl* impl,SocketIO::SIODelegate* delegate)  //SIOClient的构造函数,参数一是主机地址,参数二是端口号,参数三是终端路径,参数四是SIOClientimpl对象。

SocketIO::SIODelegate* getDelegate() //的到客户端的代理对象。

void send(const std::string& s) //发送一条消息到服务端。

void emit(const std::string& eventname,const std::string& args)  //发送指定事件和参数给客户端,参数一是事件名称,参数二是事件参数。

void on(const std::string& eventName,SIOEvent e) //注册一个套接字事件回调,回调函数通过CC_CALLBACK2使用。参数一是事件名,参数二是回调函数。

void setTag(const char* tag)给SIOClient设置标签。

const char* getTag() //获取标签的get方法

开发实例解释:

1、要使用套接字协议,首先要继承SIODelegate,并且实现必要的虚函数:

class HelloWorld:public cocos2d::Layer,public cocos2d::network::SocketIO::SIODelegate{

......//必要东西

cocos2d::network::SIOClient * _sioClient;  //封装一个SIOClinet类

......//重写上面提及到的必要函数

}

2、打开Socket链接

_sioClient = SocketIO::connect("localhost:8080",*this);  //连接服务器

_sioClient->setTag("Test Client");  //设置标记请求

_sioClient->on("testeventt",CC_CALLBACK_2(HelloWorld::onTest,this)); //注册回调事件,这就是上面提及到用"connect"事件触发的方式。

3、向服务器发送消息的方法

_sioClient->send("sdfasdfdsafs");   //发送sdfasdfdsafs消息给服务器

4、向服务器发送给定的事件和参数

_sioClient->send("testevent","{\"name"}");  //发送事件testevent给服务器,参数是{\"name"}

5、关闭连接

_sioClient->disconnect() //关闭这个套接字

猜你喜欢

转载自www.cnblogs.com/aibox222/p/9030241.html
今日推荐