zoukankan      html  css  js  c++  java
  • Cocos2d-x 网络编程

    主要介绍内容:Http协议,Socket协议,webSocket协议, Cocos2d-x中的相关类和方法

    1 Http协议

    HTTP协议也叫超文本传输协议。是互联网广泛使用的通信协议,常用于B/S架构中。
    HTTP连接使用的是短连接形式,也就是“请求-响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。

    HTTP常用的有2种数据提交方式,分别是GET、POST。
    1)get是从服务器上获取(查询)数据,post是向服务器传送数据;

    2) get传送的数据量较小,不能大于2KB,post传送的数据量较大,一般认为不受限;

    3) get安全性非常低;post安全性相对来说就比较好了;

    Cocos2d-x封装了3个类来处理HTTP请求,HttpRequest、HttpClient和HttpResponse。它们在命名空间cocos2d::network中定义,所以使用时要先声明该命名空间。

    请求过程:
    1. 创建 HttpRequest 的实例;
    2. 设置请求方式,GET、POST等。
    3. 设置请求地址和发送的数据;
    4. 设置响应回调函数,在回调函数中处理获取的数据;
    5. 创建HttpClient实例,发送请求;
    6. 释放连接。

      HttpRequest:是一种数据类型,它提供了一些方法用来定义或获取HTTP请求的参数。常用方法包括下面几种。

    设置请求连接:
    void setUrl(const char * url);
    设置请求类型:
    void setRequestType(Type type)
    Type是Cocos2d-x定义的一个枚举类型,包括5种类型。
    enum class Type
    {
    GET,
    POST,
    PUT,
    DELETE,
    UNKNOWN,
    };
    设置回调函数:
    void setResponseCallback(Ref * pTarget,SEL_HttpResponse pSelector )

    设置请求的数据,参数buffer是提交的数据,len是请求数据的长度:
    void setRequestData(const char* buffer, unsigned int len);

    HttpClient:
     用来控制请求相关的参数,比如发送请求,设置请求超时时间。它使用单例模型。这一模式的目的是使得类的一个对象成为系统中的唯一实例。cocos2d中多处用到这一模型。
    比如Director对象,创建Director::getInstance()。
    又比如,音频处理对象: SimpleAudioEngine::getInstance();
    常用方法:
    发送请求:
    send(HttpRequest* request)
    设置连接超时时间:
    setTimeoutForConnect(int value)

    HttpResponse:
    包含服务器返回的数据等信息。使用HttpResponse提供的方法可以获取这些数据。
    常用方法:
    std::vector<char>* getResponseData();
    获取请求返回的数据:
    getResponceState
    获取返回状态,返回值是一个整数,200表示请求成功,400表示服务器错误,404表示服务器上找不到相应的文件。
    issucced() ,用来判断是否返回成功

    2 WebSocket协议

    WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信。实现浏览器与服务器的即时通讯。

     WebSocket:
    WebSocket类提供了跟websocket相关操作的方法。它的作用包括:
    1、创建socket对象
    2、向服务器发送数据,可以是文本数据,也可以是二进制数据
    3、判断链接状态
    enum class ErrorCode
    {
    TIME_OUT,
    CONNECTION_FAILURE,
    UNKNOWN,
    };
    等等。

    WebSocket::Delegate:
    类似Socket。WebSocket::Delegate提供了4个纯虚函数,在使用websocket时,需要先继承Delegate类和实现这4个虚函数。

    1、virtual void onOpen(WebSocket* ws) ;
    当打开websocket连接时调用
    2、virtual void onMessage(WebSocket* ws, const Data& data) ;
    当接收到数据时调用
    3、virtual void onClose(WebSocket* ws) ;
    当关闭连接时调用
    4、virtual void onError(WebSocket* ws, const ErrorCode& error) ;
    当发送数据但没有建立连接,或者是收到断开连接的信号时调用。

     如何创建WebSocket对象并发送文本数据?

    创建对象:
    cocos2d::network::WebSocket* wsSendText = new network::WebSocket()
    初始化请求地址:
    wsSendText ->init(*this, "ws://echo.websocket.org")。
    发送数据:
    wsSendText ->send("Hello WebSocket, I'm a text message.");

     如何接受数据并发送二进制数据

    当服务器向客户端发送数据,客户端会调用onMessage方法接收返回的数据。
    数据使用WebSocket::Data封装。它是cocos2d定义的一个结构体。结果如下:
    struct Data
    {
    Data():bytes(nullptr), len(0), issued(0), isBinary(false){}
    char* bytes;
    ssize_t len, issued;
    bool isBinary;
    };
    它包含四个字段:bytes存放数据,len存放数据的长度,isBinary用来标识bytes中存放的数据是文本数据还是二进制数据。
    使用Data结构体得到数据后,就可以使用这些数据了。

    3 Socket通讯

    Socket,俗称网络套接字,本身并不是协议,而是一个调用接口,是对TCP/IP协议的封装和应用,。提供了一系列方法方便开发者进行网络通讯。
    TCP/IP协议是使用最早的通讯协议,它是传输层协议,主要解决数据如何在网络中传输。
    Socket中又分为流模式与数据报模式,即TCP与UDP两种方式。

    TCP : Transmission Control Protocol,传输控制协议,是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,但也是最安全的。
    UDP : User Data Protocol,用户数据报协议。传输数据之前源端和终端不建立连接,发送端直接把数据发送到网络,接收端把消息段放在队列中,应用程序每次从队列中读一个消息段。

     3.1 Socket基础和通信流程

     

    Socket几个定义:
    1)IP地址:即依照TCP/IP协议分配给本地主机的网络地址,两个进程要通讯,任一进程首先要知道通讯对方的位置,即对方的IP。
    2)端口号:用来辨别本地通讯进程,一个本地的进程在通讯时均会占用一个端口号,不同的进程端口号不同,因此在通讯前必须要分配一个没有被访问的端口号。
    3)连接:指两个进程间的通讯链路。
    客户/服务器模式:
    在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器(Client/Server, C/S)模式,即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。

    Socket通信流程:
    服务端:
    1、服务器端先初始化Socket
    2、当一个套接字用socket()创建后,存在一个名字空间(地址族),但它没有被命名。bind()将套接字地址(包括本地主机地址和本地端口地址)与所创建的套接字号联系起来,即将名字赋予套接字,以指定本地半相关
    3、对端口进行监听(listen)
    4、调用accept阻塞,等待客户端连接。
    客户端:
    1、客户端初始化一个Socket
    2、然后连接服务器(connect)
    3、如果连接成功,这时客户端与服务器端的连接就建立了。
    4、客户端发送数据请求(send),服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据。
    5、最后关闭连接,一次交互结束。

     3.2 SocketIO,SIODelegate和SIOClient

    类似http,cocos2d对socket也进行了封装。提供了SocketIO,SIODelegate和SIOClient三个类。

    SocketIO:connet

    使用单例模式,初始化Socket,获取SIOClient。
    SIODelegate:
    使用Socket协议,首先要继承SIODelegate,并且还要实现SIODelegate的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);

    SIOClient:
    处理Socket的一系列动作,比如,发送数据,监听事件,断开连接等


  • 相关阅读:
    C#小数点位数处理方法
    C#获取硬盘空间信息
    Linux双网卡绑定实现负载均衡
    CentOS、Ubuntu配置网卡子接口
    CentOS7修改网卡名称,禁用ipv6
    centos命令自动补全增强
    使用批处理文件访问ORACLE数据库
    Mac 常用终端命令
    常用正则表达式
    pickle 模块
  • 原文地址:https://www.cnblogs.com/kefeiGame/p/7247499.html
Copyright © 2011-2022 走看看