首先要搭建一个httpserver,这里採用tomcat6为例:

过程:新建一个Servlet,并使用tomcat的默认port号8080监听,最后写一个jsp来測试能否够訪问该server

1)新建一个Serlvet

新建完后增加写下測试代码:

public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* Default constructor.
*/
public TestServlet() {
// TODO Auto-generated constructor stub
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
} /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("test", "test");
request.getRequestDispatcher("index.jsp").forward(request, response); } }

该Servlet的名字是TestServlet。所以把web.xml中的内容改成下面内容

<?

xml version="1.0" encoding="UTF-8"?

>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>TestServlet</display-name> <servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.test.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
</web-app>

然后编写一个訪问该Servlet后会跳转的jsp(index.jsp)

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
${test }
</body>
</html>

最后启动server。在浏览器中如输入下面地址:http://localhost:8080/TestServlet/TestServlet,能够看到訪问成功

其次在cocos2d-x项目中封装curl(參考Cocos2d-x高级开发教程,并添加了能够传输多个键值对),代码比較简单,直接在凝视中说明:

头文件:

//单线程发送,会堵塞
class NetworkAdaptor {
public:
NetworkAdaptor(const string &baseUrl);//构造
NetworkAdaptor(const char* baseUrl);//构造
bool sendValueForKey(const char* key, const char* value, string &wirteBackBuffer);//发送一个HTTP请求
bool sendValueForKey(const map<string, string> &content, string &wirteBackBuffer);//发送一个HTTP请求
private:
string m_sBaseUrl;//请求的url地址
};
//多线程线程发送
class AsynNetworkAdaptor {
public:
void sendValueForKeyToUrl(const char* key, const char* value, const string &url, string &wirteBackBuffer);//添加一个HTTP请求
void sendValueForKeyToUrl(const map<string, string> content, const string &url, string &wirteBackBuffer);//添加一个HTTP请求
void flushSendRequests();//批量发送HTTP请求 CC_SYNTHESIZE_READONLY(int, m_iUnfinishedRequest, UnfinishedRequest);//发送的数量
protected:
struct RequestInfo {//请求信息
RequestInfo(const map<string, string> &content, const string &url, string &buffer) : content(content), url(url), buffer(buffer){}
map<string, string> content;//发送内容
string url;//请求的url地址
string &buffer;//server回传的内容
};
vector<RequestInfo> requests;//请求容器
};

cpp文件:

//将键值对的内容转换成表单格式的内容进行传送
void translate(const map<string, string> &content, string &sendout) {
sendout = "";
for(map<string, string>::const_iterator it = content.begin(); it != content.end(); ++it) {
sendout = sendout + (it->first + "=" + it->second) + "&";
}
sendout = sendout.substr(0, sendout.length() - 1);//去掉最后一个&字符
}
//回调函数。一定要返回服务器对应过来的字节大小
size_t writer(char* data, size_t size, size_t number, string* writeData) {
if(writeData == NULL) {
return 0;
}
writeData->append(data, size * number);
return size * number;
} NetworkAdaptor::NetworkAdaptor(const string& baseUrl) {
this->m_sBaseUrl = baseUrl;
}
NetworkAdaptor::NetworkAdaptor(const char* baseUrl) {
this->m_sBaseUrl = string(baseUrl);
}
bool NetworkAdaptor::sendValueForKey(const char* key, const char* value, string &wirteBackBuffer) {
map<string, string> content;
content.insert(make_pair(key, value));
sendValueForKey(content, wirteBackBuffer);
return true;
}
bool NetworkAdaptor::sendValueForKey(const map<string, string> &content, string &wirteBackBuffer) {
CURL* curl = curl_easy_init();//初始化curl
if(curl) {
string sendout;
translate(content, sendout);
//配置curl的请求參数
curl_easy_setopt(curl, CURLOPT_URL, m_sBaseUrl.c_str());
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_POST, 1);//post方式
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, sendout.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &wirteBackBuffer); int res = curl_easy_perform(curl);
curl_easy_cleanup(curl); if(res == CURLE_OK) {
CCLog("get data from server : %s", wirteBackBuffer.c_str());
return true;
}else {
CCLog("curl post error");
}
}else {
CCLog("curl init fail");
}
return false;
} void AsynNetworkAdaptor::sendValueForKeyToUrl(const char* key, const char* value, const string &url, string &wirteBackBuffer) {
map<string, string> content;
content.insert(make_pair(key, value));
sendValueForKeyToUrl(content, url, wirteBackBuffer);
}
void AsynNetworkAdaptor::sendValueForKeyToUrl(const map<string, string> content, const string &url, string &wirteBackBuffer) {
RequestInfo info(content, url, wirteBackBuffer);
requests.push_back(info);//将请求放到请求容器中
}
void AsynNetworkAdaptor::flushSendRequests() {
CURLM* curlm = curl_multi_init();
if(curlm) {
for(unsigned int i = 0; i < requests.size(); ++i) {//将请求容器中的请求批量发送到服务端
CURL* curl = curl_easy_init();
if(curl) {
string sendout;
translate(requests[i].content, sendout);
curl_easy_setopt(curl, CURLOPT_URL, requests[i].url.c_str());
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, sendout.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &requests[i].buffer);
int res = curl_easy_perform(curl); curl_multi_add_handle(curlm, curl);
curl_easy_cleanup(curl); }else {
CCLog("curl init fail");
break;
}
} CURLMcode curlm_code = CURLM_CALL_MULTI_PERFORM;
while(CURLM_CALL_MULTI_PERFORM == curlm_code) {
curlm_code = curl_multi_perform(curlm, &m_iUnfinishedRequest);
}
if (curlm_code != CURLM_OK) {
CCLog("curlm post error"); }
curl_multi_cleanup(curlm);
}else {
CCLog("curlm init fail");
}
}

最后写一个測试用例:

	NetworkAdaptor n("http://localhost:8080/TestServlet/TestServlet");
string v;
map<string, string> m;
m.insert(make_pair("name", "myName"));
m.insert(make_pair("password", "myPassword"));
n.sendValueForKey(m, v);
CCLog("%s", v.c_str());

改动server端的代码。使其不跳转。并给client响应一句话

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request.setAttribute("testt", "test");
//request.getRequestDispatcher("index.jsp").forward(request, response);
String name = request.getParameter("name");
String password = request.getParameter("password");
System.out.println("name: " + name + " , password: " + password);//输出从client发送过来的内容 response.getWriter().print("server have get data");//给client响应一句话
}

如在控制台看到下面測试结果。则表明訪问成功:

服务端:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2luZ2FiY2Rl/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

client:

curl的封装的更多相关文章

  1. curl操作封装

    <?php /** * Class Curl curl简单封装 get post */ class Curl { /** * @brief get请求 * @param $url 请求的url ...

  2. curl简单封装 get post

    Curl.php <?php /** * Class Curl curl简单封装 get post */ class Curl { /** * @brief get请求 * @param $ur ...

  3. php curl 请求封装

    /** * curl 封装函数 * @param string $url 请求地址 * @param string $data 请求数据 * @param string $type 请求方式 默认为G ...

  4. curl类封装

    <?php /**   * @author askwei **/   class CURL   {      private $ch;      private $url = "htt ...

  5. PHP 之CURL请求封装GET、POST、PUT、DELETE

    /** * @Description: curl请求 * @Author: Yang * @param $url * @param null $data * @param string $method ...

  6. 【转】重新封装FetchUrl函数一枚,支持COOKIES,喜欢领走~!

    mjj520 发表于 2012-6-2 09:14 唉 cpu超级耗芸豆的 查了下开发文档,fetchurl原来是不算CPU的,是我误导了大家.  发表于 2012-6-1 17:30:17 |只看该 ...

  7. file_get_contents无法请求https连接的解决方法 php开启curl

    file_get_contents无法请求https连接的解决方法 方法1: PHP.ini默认配置下,用file_get_contents读取https的链接,就会如下错误: Warning: fo ...

  8. [原创]cocos2dx加载网络图片&异步加载图片

    [动机] 之前看到一款卡牌游戏,当你要看全屏高清卡牌的时候,游戏会单独从网络上下载,本地只存了非高清的,这样可以省点包大小,所以我萌生了实现一个读取网络图片的类. [联想] 之前浏览网页的时候经常看到 ...

  9. PHP ElasticSearch的使用

    系统是Windows server 2003. ElasticSearch是一个基于Lucene的稳定的.分布式.RESTFul的搜索引擎.其实所谓的RestFul就是它提供URL供你调用(建立索引和 ...

随机推荐

  1. Windows Azure入门教学系列 (六):使用Table Storage

    本文是Windows Azure入门教学的第六篇文章. 本文将会介绍如何使用Table Storage.Table Storage提供给我们一个云端的表格结构.我们可以把他想象为XML文件或者是一个轻 ...

  2. Spring3表达式语言(SpEL)学习笔记

    最新地址请访问:http://leeyee.github.io/blog/2011/06/19/spring-expression-language Spring Excpression Langua ...

  3. ABAP常用字符串处理

    1.SEARCH搜索指定字符串 REPORT Z_CHAR. ). MOVE 'Welcom to sap world!' to str. SEARCH str for 'sap'. 如果查找成功sy ...

  4. 【OpenMesh】Some basic operations: Flipping and collapsing edges

    这一节中你将学到一些OpenMesh中早已提供的基础操作. 内容包括三角形网格边的翻转以及通过连接邻接的顶点边缘折叠. 三角形网格的翻转(Flipping edges) 考虑到两个邻接面的三角形网格中 ...

  5. 基础知识(3)- Java的基本程序设计结构

    3.1 一个简单的Java应用程序 3.2 注释 3.3 数据类型  3.3.1 整型  3.3.2 浮点类型  3.3.3 char类型  3.3.4 boolean类型 3.4 变量  3.4.1 ...

  6. 591 - Box of Bricks

     Box of Bricks  Little Bob likes playing with his box of bricks. He puts the bricks one upon another ...

  7. Dom对象和JQuery对象的详细介绍及其区别

    一直搞不清Dom对象和JQuery对象之间的区别,今天好好总结下 1.dom对象(摘抄自百度百科http://baike.baidu.com/link?url=4L8bZ7kW6kE-it4F-1LU ...

  8. (并查集)POJ 1308 & HDU 1325

    一开始以为两道题是一样的,POJ的过了直接用相同代码把HDU的交了,结果就悲剧了.最后发现HDU的没有考虑入度不能大于一. 题意:用树的定义来 判断吧,无环,n个结点最多有n-1条边,不然就会有环.只 ...

  9. IBinder在进程之间传递一个对象的形式(一)

    主张 什么时候service通常被称为远程时的,用到aidl来定一个接口供service和client来使用,这个事实上就是使用Binder机制的IPC通信.当client bind service成 ...

  10. Lu核心库系统结构及输出函数

    Lu核心库系统结构及输出函数 Lu来源于Forcal,可以说,没有Forcal就没有Lu,但学习Lu并不需要了解Forcal. Lu是对Forcal的完善和发展,但与Forcal相比,Lu更简洁实用. ...