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() //关闭这个套接字