【Cocos2dx-3.x】通信协议之Socket通信协议篇

【Cocos2dx-3.x】通信协议之Socket通信协议篇

好记性不如烂笔头

前言

上一篇说了cocos2dx中使用Http通信协议,这篇主要说Socket协议的使用,细心地朋友会发现,这里源码在TestCpp中都可以找到;对,我只是提取部分代码来说,具体可以看TestCpp中例子。接下来开始进入今天要说的Socket通信协议:

Socket链接过程一般分为3个步骤:服务器监听,客户端请求,连接确认:
1.服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
2.客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
3.连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

Socket类型有2种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM);
1.流式Socket(SOCK_STREAM)是一种面向连接的Socket,针对面向连接的TCP服务应用;
2.数据报式Socket(SOCK_DGRAM)是一种无连接的Socket,对应于无连接的UDP服务应用;

HTTP、Socket 就像网上所说的一个是发动机(Socket),提供了网络通信的能力;一个是轿车(Http),提供了具体的方式;
更多关于Socket介绍的可以参考:百度文库、

预备工作

首先创建4个按钮,如图所示:

Socket协议

1.使用Socket协议,首先要继承SIODelegate,并且还要实现SIODelegate的4个虚函数:
我们可以进去看SIODelegate这个类,如图:
可以看到这4个虚函数,所以我们要在自己的类中实现这个4个虚函数,如下:

//当打开socket连接时会调用这个函数virtual void onConnect(cocos2d::network::SIOClient* client);//当接收到数据时会调用这个函数virtual void onMessage(cocos2d::network::SIOClient* client, const std::string& data);//当socket关闭时,会调用这个函数virtual void onClose(cocos2d::network::SIOClient* client);//当连接错误时会调用这个函数virtual void onError(cocos2d::network::SIOClient* client, const std::string& data);

2.在1 Open SocketIO Client按钮响应函数中调用createSocket()方法,作用是打开Socket连接:

//打开Socket连接void TestSocket::createSocket(){// 打开Socket连接_sioClient = SocketIO::connect("ws://channon.us:3000", *this);//设置标记请求_sioClient->setTag("Test Client");//注册socket.io事件回调函数_sioClient->on("testevent", CC_CALLBACK_2(TestSocket::testevent, this));_sioClient->on("echotest", CC_CALLBACK_2(TestSocket::echotest, this));}void TestSocket::testevent(SIOClient *client, const std::string& data){log("TestSocket::testevent called with data: %s", data.c_str());}void TestSocket::echotest(SIOClient *client, const std::string& data){log("TestSocket::echotest called with data: %s", data.c_str());}

3.在2 send Massage按钮响应函数中调用sendMessage()方法,作用是打开向服务器发送消息:

//向服务器发送消息void TestSocket::sendMessage(){if (_sioClient) {//发送消息到socket.Io服务器_sioClient->send("Hello Socket.IO!");}}

4.在3 submit Massage按钮响应函数中调用sendEvent()方法,作用是委托处理socket.Io服事件,利用emit触发echotest事件

//委托处理socket.Io服事件,利用emit触发echotest事件void TestSocket::sendEvent(){if (_sioClient) {//委托处理socket.Io服事件,利用emit触发echotest事件_sioClient->emit("echotest","[{"name":"myname","type":"mytype"}]");}}

5. 在4 close SocketIO Client按钮响应函数中调用closeSocket()方法,作用是关闭Socket:

//关闭socket连接void TestSocket::closeSocket(){if (_sioClient) {//关闭socket连接,完成后会调用代理函数onClose()_sioClient->disconnect();}}

6.实现所集成的虚方法:

//当打开socket连接时会调用这个函数void TestSocket::onConnect(cocos2d::network::SIOClient* client){log("TestSocket::onConnect called");}//当接收到数据时会调用这个函数void TestSocket::onMessage(cocos2d::network::SIOClient* client, const std::string& data){log("TestSocket::onMessage received: %s", data.c_str());}//当socket关闭时,会调用这个函数void TestSocket::onClose(cocos2d::network::SIOClient* client){CCLOG("TestSocket::onClose called");}//当连接错误时会调用这个函数void TestSocket::onError(cocos2d::network::SIOClient* client, const std::string& data){log("Error received: %s", data.c_str());}

到这里就结束了,想看运行结果的,可以再我得getHub上下载源码,在控制台可以看到详细的输出与调用流程,点击这里下载本节源码;

总结

这小节简单的介绍了Socket的用法,从TestCpp中摘要代码,按照自己的理解记录本章节,现暂时没有用到Socket网络通信协议,没有深入的了解和灵活的使用,待以后继续跟新本章节,下章节会降到WebSocket的用法。
更多文章可以访问我得个人博客:www.sydev.cn

推荐阅读