zoukankan      html  css  js  c++  java
  • 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() //关闭这个套接字

  • 相关阅读:
    QGroundControl编译出错记录
    【Luogu】【关卡2-5】字符串处理(2017年10月)
    【Luogu】【关卡2-4】排序Ex(2017年10月)
    【Luogu】【关卡2-3】排序(2017年10月) 【AK】
    【Luogu】【关卡2-2】交叉模拟(2017年10月)
    【Luogu】【关卡2-1】简单的模拟(2017年10月)
    【基础】图论基础 2017/04/20
    【LeetCode】BFS || DFS [2017.04.10--2017.04.17]
    【LeetCode】排序
    【LeetCode】贪心
  • 原文地址:https://www.cnblogs.com/aibox222/p/9030241.html
Copyright © 2011-2022 走看看