Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

关于cocos2dx网络编程http,udp,tcp,socket

$
0
0

先学习概念

来自仗剑量天的博客

socket 套接字 用于描述IP地址和端口。
套接字分为
1. tcp 流式套接字
2. udp 数据报式套接字

socket是对tcp/ip协议的封装和应用,它本身并不是协议,而是一个调用接口(API),也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输。
HTTP协议也叫超文本传输协议
HTTP是一个无连接,无状态连接的应用层协议,由请求-响应构成,是标准的C/S模型,主要解决如何包装数据。
HTTP连接使用的是“请求-响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。

HTTP连接与Socket连接
Socket连接:服务器就可以直接将数据传送给客户端,直到双方断开连接。
HTTP连接:服务器需要等到客户端发送一次请求后才能将数据传回给客户端,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。

讲了那么多概念性的东西后,我们看这俩种方式的具体使用。
先我们看HTTP协议的用法:
常用的两种HTTP通信方式有get和post,我们来看看这俩种方式有什么异同
1> get是从服务器上获取(查询)数据,post是向服务器传送(修改)数据;
2> get传送的数据量较小,不能大于2KB,post传送的数据量较大,一般认为不受限;
3> get安全性非常低,通常是逃不过像Wireshark这类功能强大的抓包工具的,但执行效率比较好;post安全性相对来说就比较好了;

建议:在做数据查询时用get方式,而在做数据添加,修改或删除时用post方式

demo如下:
环境:cocos2d-lua 3.13,mac10.11.6,xcode8.2.1,


//
//  MyNetWork.cpp
//  Slither
//
//  Created by Mybo on 17/3/8.
//
//

#include "MyNetWork.hpp"
#include "network/HttpRequest.h"
#include "network/HttpResponse.h"
#include "network/HttpClient.h"
using namespace cocos2d::network;
MyNetWork* MyNetWork::getInstance(){
    static MyNetWork* _instance = nullptr;
    if (_instance == nullptr) {
        _instance = new MyNetWork;
    }
    return _instance;
}
void MyNetWork::onHttpRequest(const std::string& url,HttpRequest::Type type,SEL_HttpResponse pSelector){
    auto request = new HttpRequest();
    request->setUrl(url);
    request->setRequestType(type);
    printf("onHttpRequest");
    request->setResponseCallback(this,pSelector );
    HttpClient::getInstance()->send(request);
    request->release();
}
//
//  MyNetWork.hpp
//  Slither
//
//  Created by Mybo on 17/3/8.
//
//

#ifndef MyNetWork_hpp
#define MyNetWork_hpp

#include <stdio.h>
#include "cocos2d.h"
USING_NS_CC;
#include "extensions/cocos-ext.h"
#include "network/HttpClient.h"
USING_NS_CC;
USING_NS_CC_EXT;
using namespace network;

class MyNetWork :public Ref
{
public:
    static MyNetWork * getInstance();
    void onHttpRequest(const std::string& url,HttpRequest::Type type,SEL_HttpResponse pSelector);
//    void onHttpRequestCompleted(Node* sender,void* data);
    //Http Response Callback
};
#endif /* MyNetWork_hpp */

下面是回调方法


void OneBody::onHttpRequestCompleted(cocos2d::network::HttpClient *sender, cocos2d::network::HttpResponse *response)
{
    if (!response) {
        return;

    }

    if (0 != strlen(response->getHttpRequest()->getTag())) {
        log("%s completed",response->getHttpRequest()->getTag());
    }

    long statusCode = response->getResponseCode();
    char statusString[64] = {};

    sprintf(statusString, "HTTP Status Code: %ld, tag = %s",statusCode,response->getHttpRequest()->getTag());
    log("response code: %ld",statusCode);

    if (!response->isSucceed()) {
        log("response failed");
        log("error buffer: %s",response->getErrorBuffer());
        return;

    }

    std::vector<char>* buffer = response->getResponseData();
    printf("Http Test, dump data: ");
    for (unsigned int i = 0 ; i < buffer->size();i++) {
        printf("%c",(*buffer)[i]);
    }
    printf("\n");
}

调用方式


    MyNetWork::getInstance()->onHttpRequest("url地址",HttpRequest::Type::GET,httpresponse_selector(OneBody::onHttpRequestCompleted));
作者:liqiangxo 发表于2017/3/9 14:06:32 原文链接
阅读:7 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>