HttpClient实现客户端与服务器的通信

本篇主要讲解了利用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 0printf("This is cocos cgi-test\n");// 打印环境变量extern char** environ;int i;for(i=0; ;++i){if(environ[i])printf("%s\n<br>", environ[i]);elsebreak;}#endif// set Score to Databasechar* 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 0printf("%s<br>", sql);return 0;#endifif(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 serverint 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 commonif (!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 labelsCCLabelTTF *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;
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯阿里是否开始走向没落,用新互联网大脑模型分析

前言&#xff1a;虽然腾讯面临头条、抖音、陌陌、钉钉等新兴社交平台挑战&#xff0c;阿里面临海尔COSMOPlat&#xff0c;三一重工树根互联、美国GE Predix、德国西门子Mindsphere等工业互联网平台的挑战&#xff0c;但其核心优势依然存在&#xff0c;积累势能继续提高&#xf…

这5个超级经典SQL都不会,回去等通知吧

&#x1f345; 简介&#xff1a;CSDN博客专家&#x1f3c6;、信息技术智库公号作者✌ 简历模板、PPT模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 一、每门课程问题 用一条 SQL 语句…

12.4scrum report

转载于:https://www.cnblogs.com/76er/archive/2012/12/04/2802336.html

markdown下编辑latex数学公式

在利用为知笔记编写笔记的时候&#xff0c;有时需要用的markdown&#xff0c;只要把文件名加上后缀.md,就可以使用markdown语法&#xff0c;以下介绍在markdown下编辑latex数学公式. 使用LaTeX写公式的基本语法 LaTeX 公式有两种&#xff0c;一种是用在正文中的&#xff0c;一…

从《2018年全球创新指数报告》看中国创新力!

作者&#xff1a;杨柯巍 张原编辑&#xff1a;煜 佳来源&#xff1a;中国电子信息产业发展研究院摘要&#xff1a;2018 年7 月10 日&#xff0c;世界知识产权组织&#xff08;WIPO&#xff09;、美国康奈尔大学和欧洲工商管理学院&#xff08;INSEAD&#xff09;共同发布《2018…

【每日SQL打卡】DAY 1丨部门工资最高的员工【难度中等】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 活动流程&#xff1a; 1…

如何从操作系统安装文件提取驱动文件/ How to extract driver files from setup files (win 7)...

在部署 OS 过程中遇到一个问题&#xff0c;需要找到操作系统对于的驱动文件。由于OS都是直接从微软服务器上面copy下来的&#xff0c;所以&#xff0c;要找到对应的 Device Drivers很困难。好不容易找到一个Drivers的文件夹&#xff0c;发现各种驱动啊&#xff0c;估计也只有当…

【每日SQL打卡】​​​​​​​​​​​DAY 2 丨组合两个表【难度简单】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

业界 |「多巴胺」来袭!谷歌推出新型强化学习框架Dopamine

作者&#xff1a;Pablo Samuel Castro、Marc G. Bellemare 来源&#xff1a;Google AI Blog,机器之心摘要&#xff1a;在过去几年里&#xff0c;强化学习研究取得了多方面的显著进展。在过去几年里&#xff0c;强化学习研究取得了多方面的显著进展。这些进展使得智能体能够以超…

Android客户端与服务器之间传递json数据

在服务器与客户端之间通信&#xff0c;json数据是一种常用格式&#xff0c;本文主要在服务器端构建数据&#xff0c;在客户端接收显示&#xff0c;并且在listview上显示出来 服务器端的构建 简单的javabean与返回结果函数与插入函数略过 public void doGet(HttpServletReque…

高通全系列手机处理器深度解析 (升级选手机必备)附参数对比表

关于高通处理器和ARM之间的关系 正式介绍高通处理器之前&#xff0c;笔者认为还是先来大致了解下高通和ARM公司之间的关系。在之前的文章中我们也介绍过ARM公司以及相应的ARM架构&#xff0c;实际上&#xff0c;包括高通在内所有终端手机芯片厂商的手机处理器产品的底层都是基…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 2丨连续出现的数字【难度中等】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

《2018中国大数据发展指数报告》发布:广东、上海、贵州、北京、重庆领先

来源&#xff1a;网络传播杂志摘要&#xff1a;2018年8月24日&#xff0c; 中国电子信息产业发展研究院在首届“中国国际智能产业博览会”上发布了《中国大数据发展指数报告(2018年)》。此报告为我国找准大数据行业发展重点、优化行业发展环境、调整行业管理体制机制等提供了有…

利用gitbash上传项目到github

GitHub主要是用作基于Git的分布式版本管理系统的库&#xff0c;可以保存和管理自己的代码&#xff0c;而且主要用作代码的合作开发。不过对于我来说&#xff0c;Git控制系统还比较难以掌握&#xff0c;或者开发小系统还不太用得着&#xff0c;因此我把GitHub当作分享和展示代码…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 3丨删除重复的电子邮箱【难度简单】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

[转载]ubuntu 12.10 软件源更新列表

原文地址&#xff1a;ubuntu 12.10 软件源更新列表&#xff08;转&#xff09;作者&#xff1a;Ultimate参考的是http://www.linuxidc.com/Linux/2012-10/73114.htm 安装ubuntu12.10之后&#xff0c;第一件事就是更换源&#xff0c;ubuntu网易163的更新源速度一直很好。 首…

k8s学习 — 各知识点快捷入口

k8s学习 — 各知识点快捷入口 k8s学习 — 第一章 核心概念 k8s学习 — 第一章 核心概念 命名空间 实践&#xff1a; k8s学习 — &#xff08;实践&#xff09;第二章 搭建k8s集群k8s学习 — &#xff08;实践&#xff09;第三章 深入Podk8s学习 — &#xff08;实践&#xff0…

36氪研究 | 智慧零售行业研究报告

来源&#xff1a;36Kr智慧零售带来的变化&#xff0c;对你我的生活有多大的影响&#xff1f;上世纪末&#xff0c;当你想吃一桌大鱼大肉改善一下近期的伙食&#xff0c;下馆子是一个不错的选择&#xff0c;但由于这样会超出你的消费预期&#xff0c;买回家自己烹饪便成为了你唯…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 3丨行程和用户【难度困难】

活动介绍&#xff1a; 「数据仓库技术交流群」已经正式启动每日SQL打卡&#xff0c;帮助大家扎实基础&#xff0c;努力工作之余&#xff0c;别忘了自我提升。 欢迎报名和邀请小伙伴参与&#xff0c;一个人可能走得很快&#xff0c;但一群人会走得很远。 &#x1f345;题目汇总(…

数据结构之线性表

一、线性表的顺序存储实现&#xff0c;利用数组实现线性表 typedef struct{int Data[MAXSIZE];int Last; }List;List *MakeEmpty() {List *PtrL;PtrL(List*)malloc(sizeof(List));PtrL->Last-1;return PtrL; } int FindKth( int K, List* PtrL ) //根据位序K&#xff0c;返…