本篇主要讲解了利用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 1154 Spring Outing

    传送门 #1154 : Spring Outing 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 You class are planning for a spring ...

  2. Linux内核之内存管理完全剖析

    linux虚拟内存管理功能 ? 大地址空间:? 进程保护:? 内存映射:? 公平的物理内存分配:? 共享虚拟内存.实现结构剖析   (1)内存映射模块(mmap):负责把磁盘文件的逻辑地址映射到虚拟地 ...

  3. 在微信中实现app软件中账号注册的功能实现

    利用写好的接口url地址访问 输入手机号,接收手机验证码 <span class="accept" >点击获取验证码</span> $(".acc ...

  4. eclipse错误:Unable to read workbench state. Workbench UI layout will be reset.XML document structures

    Unable to read workbench state. Workbench UI layout will be reset.XML document structures must start ...

  5. ECSHOP管理员密码忘记了怎么办?

    ECSHOP管理员密码忘记了怎么办? ECSHOP教程/ ecshop教程网(www.ecshop119.com) 2013-09-06   不小心在后台把管理员全部给清空了,闹的网站都无法登陆了?有 ...

  6. Unity教程之再谈Unity中的优化技术

    这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体   这一步主要是为了针对性能瓶颈中的”顶点 ...

  7. Nginx使用的php-fpm的两种进程管理方式及优化(转)

    php-fpm目前主要又两个分支,分别对应于php-5.2.x的版本和php-5.3.x的版本.在5.2.x的版本中,php-fpm.conf使用的是xml格式,而在新的5.3.x版本中,则是和php ...

  8. memcached 系列2:memcached实例(转载)

    在上一篇文章,我们讲了,为什么要使用memched做为缓存服务器(没看的同学请点 这里).下面让我们以memcached-1.2.1-win32版本的服务组件(安装后是以一个windows服务做dae ...

  9. 拆分Spring配置文件

    把一个applicationContext.xml拆分(还可以再分出action部分和tx事务部分) 1.dao部分 <!-- 配置DAO --> <bean id="em ...

  10. ubuntu快速清理磁盘垃圾

    .快速清理磁盘垃圾 磁盘空间又不够用了?尝试在终端窗口中输入sudo apt-get autoremove然后输入sudo apt-get clean,前一个命令会卸载系统中所有未被使用的依赖关系,后 ...