關於cocos2dx網絡編程http,udp,tcp,socket

先學習概念

來自仗劍量天的博客

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));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章