本篇主要讲解了利用HttpClient实现 windows主机与linux服务器的通信与传递数据

HttpClient代码,服务器端配置

系统和安装软件

1)ubuntu 14.04 64位系统

2)sudo apt-get install apache2 sqlite3 libsqlite3-dev

配置apache 支持cgi

配置目录 /etc/apache2

html页面目录 /var/www/html

cgi-bin目录 /usr/lib/cgi-bin

日志文件 /var/log/apache2

1)/etc/apache2/mods-enable里增加支持cgi的mod

cd /etc/apache2/mods-enabled

sudo ln -s ../mods-available/cgid.conf

sudo ln -s ../mods-available/cgid.load

sudo ln -s ../mods-available/cgi.load

2) 编辑cgi代码: /usr/lib/cgi-bin/setScore.c

sudo gcc /usr/lib/cgi-bin/setScore.c -o /usr/lib/cgi-bin/setScore.cgi

3) 建立数据库

sudo sqlite3 /var/tank/tank.db

create table tscore (id integer primary key autoincrement, username varchar(32) unique not null, totalscore integer not null, score integer not null);

4) 修改数据库文件的权限

sudo chmod 777 /var/tank -R

sudo chmod www-data:www-data /var/tank -R

CGI代码如下,写数据库与读数据库并且向网页打印返回

    #include <stdio.h>
#include <sqlite3.h>
#include <string.h>
#include <stdlib.h>
int selectCallback(void* arg,int argc,char** argv,char** argvv)
{
//argv[0] id
//argv[1] username
//argv[2] totalscore
//argv[3] score // username&totalscore&score&....
printf("%s&%s&%s&", argv[1], argv[2], argv[3]);
return 0;
} int main()
{
printf("Content-type:text/html\n\n");
#if 0
printf("This is cocos cgi-test\n");
// 打印环境变量
extern char** environ;
int i;
for(i=0; ;++i)
{
if(environ[i])
printf("%s\n<br>", environ[i]);
else
break;
}
#endif // set Score to Database
char* queryString = getenv("QUERY_STRING");
if(queryString == NULL)
{
printf("Err: queryString is NULL");
return 0;
} // totalscore=%d&score=%d&user=user%d
// 获取参数
char* totalScore = strtok(queryString, "&");
char* score = strtok(NULL, "&");
char* username = strtok(NULL, "&"); strtok(totalScore, "=");
totalScore = strtok(NULL, "="); strtok(score, "=");
score = strtok(NULL, "="); strtok(username, "=");
username = strtok(NULL, "="); // 写数据库
sqlite3* db;
int ret = sqlite3_open("/home/jjx/tank.db", &db);
if(ret != SQLITE_OK)
{
printf("open database error: %s", sqlite3_errstr(sqlite3_errcode(db)));
return 0;
} char sql[2048];
sprintf(sql, "insert into tscore (username, totalscore, score) values ('%s', %s, %s)",
username, totalScore, score);
ret = sqlite3_exec(db, sql, NULL, NULL, NULL);
#if 0
printf("%s<br>", sql);
return 0;
#endif
if(ret != SQLITE_OK)
{
printf("insert data error: %s", sqlite3_errstr(sqlite3_errcode(db)));
sqlite3_close(db);
return 0;
} sprintf(sql, "select * from tscore order by totalscore desc limit 10");
ret = sqlite3_exec(db, sql, selectCallback, NULL, NULL);
if(ret != SQLITE_OK)
{
printf("select data error: %s", sqlite3_errstr(sqlite3_errcode(db)));
sqlite3_close(db);
return 0;
} sqlite3_close(db); return 0;
}

服务器端配置完成

客户端发送数据代码实现

    //send http request ,send total score and score to server
int totalScore=CCUserDefault::sharedUserDefault()->getIntegerForKey("TotalScore");
int score=CCUserDefault::sharedUserDefault()->getIntegerForKey("Score");
int userid=CCRANDOM_0_1()*100;
char url[2048];
sprintf(url,"http://192.168.226.129/cgi-bin/setScore.cgi?totalscore=%d&score=%d&user=user%d",totalScore,score,userid);
CCHttpClient *client=CCHttpClient::getInstance();
CCHttpRequest *request=new CCHttpRequest;
request->setUrl(url);
request->setRequestType(CCHttpRequest::kHttpGet);
request->setResponseCallback(this,httpresponse_selector(LayerScore::HttpResponse));
client->send(request);
request->release();

客户端接收数据

    //receive data from server
//json data is most common
if (!response->isSucceed())
{
CCLOG("request error:%s",response->getErrorBuffer());
return;
} std::vector<char>* data=response->getResponseData();
std::vector<char>::iterator it;
std::string str;
for(it=data->begin();it!=data->end();it++)
{
str.push_back(*it);
} char *p=new char[str.size()+1];
strcpy(p,str.c_str());
p[strlen(p)-1]=0;
int index=0;
char *username=strtok(p,"&");
char *totalScore;
char *score;
char buf[1024];
while (username)
{
totalScore=strtok(NULL,"&");
score=strtok(NULL,"&");
CCLOG("********%s,%s,%s********\n",username,totalScore,score);
//put data into labels
CCLabelTTF *label=(CCLabelTTF*)getChildByTag(1000+index++);
sprintf(buf,"%s:%s:%s",username,totalScore,score);
label->setString(buf);
username=strtok(NULL,"&"); }
delete []p;

HttpClient实现windwos主机与linux服务器通信并传递信息

以上是以DOGet方法,将参数设置在URL中以到达传递参数的作用,下面使用DOPost方法向服务器端上传图片

客户端上传代码

CCHttpClient* client = CCHttpClient::getInstance();

    CCHttpRequest* req = new CCHttpRequest;
req->setUrl("http://192.168.226.129/cgi-bin/posttest.cgi");
req->setRequestType(CCHttpRequest::kHttpPost);
req->setResponseCallback(this, httpresponse_selector(T24HttpClient::HttpResponse)); char buf[8192]; FILE* f = fopen("woman.png", "rb");
int len = fread(buf, 1, 8192, f);
fclose(f);
CCLog("len=%d\n", len); req->setRequestData((const char*)buf, len);
//req->setRequestData(buf,sizeof(buf));
client->send(req);
req->release(); return true;

服务器端接收代码

#include <stdio.h>
#include <sqlite3.h>
#include <string.h>
#include <stdlib.h> int main()
{
printf("Content-type:text/html\n\n"); int fd=creat("/home/jjx/tank/aaa.png");
int len=atoi(getenv("CONTENT_LENGTH"));
char *buf=malloc(len);
fread(buf,len,1,stdin);
write(fd,buf,len);
close(fd);
free(buf); printf("%s\n<br>",buf);
return 0;
}

上传结束,可以在相应文件路径下看到图片

HttpClient实现客户端与服务器的通信的更多相关文章

  1. Nio使用Selector客户端与服务器的通信

    使用NIO的一个最大优势就是客户端于服务器自己的不再是阻塞式的,也就意味着服务器无需通过为每个客户端的链接而开启一个线程.而是通过一个叫Selector的轮循器来不断的检测那个Channel有消息处理 ...

  2. 用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰

    服务器: 1.与客户端的交流手段多是I/O流的方式 2.对接的方式是Socket套接字,套接字通过IP地址和端口号来建立连接 3.(曾经十分影响理解的点)服务器发出的输出流的所有信息都会成为客户端的输 ...

  3. motan源码分析六:客户端与服务器的通信层分析

    本章将分析motan的序列化和底层通信相关部分的代码. 1.在上一章中,有一个getrefers的操作,来获取所有服务器的引用,每个服务器的引用都是由DefaultRpcReferer来创建的 pub ...

  4. 客户端与服务器之间通信收不到信息——readLine()

    写服务器端和客户端之间通信,结果一直读取不到信息,在https://blog.csdn.net/yiluxiangqian7715/article/details/50173573 上找到了原因:使用 ...

  5. HttpWebRequest 基础连接已经关闭: 接收时发生错误 GetRequestStream 因为算法不同,客户端和服务器无法通信。

    在代码行 HttpWebRequest objRequest = (HttpWebRequest)HttpWebRequest.Create(sUrl 前面加上 ServicePointManager ...

  6. Java网络编程客户端和服务器通信

    在java网络编程中,客户端和服务器的通信例子: 先来服务器监听的代码 package com.server; import java.io.IOException; import java.io.O ...

  7. Java模拟客户端向服务器上传文件

    先来了解一下客户端与服务器Tcp通信的基本步骤: 服务器端先启动,然后启动客户端向服务器端发送数据. 服务器端收到客户端发送的数据,服务器端会响应应客户端,向客户端发送响应结果. 客户端读取服务器发送 ...

  8. Socket与SocketServer结合多线程实现多客户端与服务器通信

    需求说明:实现多客户端用户登录,实现多客户端登录一般都需要使用线程技术: (1)创建服务器端线程类,run()方法中实现对一个请求的响应处理: (2)修改服务器端代码,实现循环监听状态: (3)服务器 ...

  9. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)

    转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...

随机推荐

  1. hihoCoder 1195 高斯消元.一

    传送门 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:喂不得了啦,那边便利店的薯片半价了! 小Hi:啥?! 小Ho:那边的便利店在打折促销啊. 小Hi:走走走, ...

  2. mvc中EditorFor TextBoxFor什么区别

    EditorFor 是映射到Model 属性上面,忽略用户自定义属性和样式 Model 可以为nullTextBoxFor是映射到Model 属性上面,可以用户自定义属性和样式 Model 不可以为n ...

  3. ExtJS入门教程02,form也可以很优雅

    在上一篇<Extjs window 入门>中,我们已经看到了如何将一个form组件放到window中,今天我们来看看form的一些优雅的工作方式. 使用fieldDefaults,优雅的设 ...

  4. Spring学习3—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)

    一.思想理解 Spring 能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的 管理下有机地协调.运行.S ...

  5. nginx负载均衡器处理session共享的几种方法(转)

    1) 不使用session,换作cookie 能把session改成cookie,就能避开session的一些弊端,在从前看的一本J2EE的书上,也指明在集群系统中不能用session,否则惹出祸端来 ...

  6. ajax原理,验证码生成原理

    什么是ajax AJAX:”Asynchronous JavaScript and XML” 中文意思:异步JavaScript和XML 指一种创建交互式网页应用的网页开发技术.   不是指一种单一的 ...

  7. mysql 查询技巧

    查出来的结果每一行显示一条,中间以*号分隔. select * from tableName limit 10 \G mysql 随机取数据 SELECT * FROM table_name ORDE ...

  8. ThinkPHP自动获取关键词(调用第三方插件)

    ThinkPHP自动获取关键词调用在线discuz词库 先按照下图路径放好插件 方法如下 /** * 自动获取关键词(调用第三方插件) * @return [type] [description] * ...

  9. Chrome中的Device模块调式响应性设计

    Chrome中的Device模块调式响应性设计 阅读目录 启用Device模块 Device模块设置介绍 自定义预设介绍 查看media queries 触发触摸事件 回到顶部 启用Device模块 ...

  10. javascript工厂模式

    工厂模式 设计工厂模式的目的是为了创建对象.它通常在类或者类的静态方法实现,具有下列目标: 1.在创建相似对象是执行重复操作 2.在编译时不知道具体类型(类)的情况下,为工厂客户提供一种创建对象的接口 ...