先学习概念
来自仗剑量天的博客
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));