1.httpClient和ScrollView
1 在服务器端使用sqllite编写数据库
常见命令是:sqlite3 tank.db
进入之后创建表:
create table tscore ( id integer primary key autoincrement, username varchar(32) unique not null, totalscore integer not null, score integer not null ); |
在服务器端编写程序:
#include<stdio.h> #include<sqlite3.h> #include<string.h> #include<stdlib.h> int main() printf("Content-type:text/html\n\n"); //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,"="); //写数据库 sqlite3* db; int ret = sqlite3_open("/usr/lib/cgi-bin/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)",usernam| e,totalScore,score); ret = sqlite3_exec(db,sql,NULL,NULL,NULL); printf("%s<br>",sql); if(ret != SQLITE_OK) { printf("insert data error:%s",sqlite3_errstr(sqlite3_errcode(db))); sqlite3_close(db); return 0; } return 0; } |
编译: sudo gcc setScore.c -o setScore.cgi -lsqlite3 注意要加上最后面的-lsqlite3,不然 设置tank.db的权限 在浏览器中输入以下链接地址: http://192.168.28.155/cgi-bin/setScore.cgi?totalscore=100&score=1011&username=toto 网页中的输出运行结果: tank.db中的内容如下: |
2 游戏服务器端代码,用于操作数据库
#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("/usr/lib/cgi-bin/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; } |
Makefile文件 |
cfiles := $(shell find -name "*.c") targets := $(cfiles:.c=.cgi) all: $(targets) %.cgi:%.c gcc -o $@ $^ -lsqlite3 .PHONY: clean clean: rm *.cgi |
编译: sudo gcc setScore.c -o setScore.cgi -lsqlite3 浏览器访问: http://192.168.28.155/cgi-bin/setScore.cgi?totalscore=90&score=121&username=toto23 |
较完整的服务器段代码
setScore.c |
#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("/usr/lib/cgi-bin/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; } |
3 HttpClient的客户端:
T24HttpClient.h(Get方式) |
#ifndef #define #include #include #include USING_NS_CC; USING_NS_CC_EXT; class { public: CREATE_FUNC(T24HttpClient); bool init(); static void HttpResponse(CCHttpClient* }; #endif |
T24HttpClient.cpp |
#include CCScene* { CCScene* scene = T24HttpClient* layer = scene->addChild(layer); return scene; } bool { TBack::init(); //向服务器发送请求(http报文)单例 CCHttpClient* client = //创建一个request对象 CCHttpRequest* request = //设置访问URL request->setUrl("http://192.168.192.130/cgi-bin/setScore.cgi?username=xxx&score=xxxx&totalscore=xxx"); request->setResponseCallback(this, //要对client进行release client->release(); return } //通过回调的方式实现 void { if (!response->isSucceed()) { CCLog("response error: %s", return; } //获得相应的数据 std::vector<char>* data = std::string strData; std::vector<char>::iterator it; for (it = data->begin(); it != data->end(); ++it) { strData.push_back(*it); } CCLog("response data is: %s", strData.c_str()); } |
运行结果: |
HttpClient(POST方式); |
#ifndef #define #include #include #include USING_NS_CC; USING_NS_CC_EXT; class { public: CREATE_FUNC(HttpClientPost); bool init(); static void HttpResponse(CCHttpClient* }; #endif |
HttpClientPost.cpp |
#include CCScene* { CCScene* scene = HttpClientPost* layer = scene->addChild(layer); return scene; } bool { TBack::init(); //向服务器发送请求(http报文) CCHttpClient* client = CCHttpRequest* req = req->setUrl("http://192.168.192.131/cgi-bin/posttest.cgi"); req->setRequestType(CCHttpRequest::kHttpPost); req->setResponseCallback(this, char buf[8192]; FILE* f = fopen("btn_go_0.png","rb"); int len = fread(buf,1,8192,f); fclose(f); CCLOG("len=%d\n",len); req->setRequestData((const client->send(req); req->release(); return } void { //如果相应失败 if (!response->isSucceed()) { //获取失败信息 CCLog("response error: %s", return; } //获得相应的数据 std::vector<char>* data = std::string strData; std::vector<char>::iterator it; for (it = data->begin(); it != data->end(); ++it) { strData.push_back(*it); } CCLog("response data is:%s", strData.c_str()); } |
运行结果: |
2 CCScrollView案例
T25ScrollView.h |
#ifndef #define #include #include #include USING_NS_CC; USING_NS_CC_EXT; class { public: CREATE_FUNC(T25ScrollView); bool init(); static bool ccTouchBegan(CCTouch *pTouch, void ccTouchEnded(CCTouch *pTouch, void adjustViewPos(float CCNode* _node; bool isSlider(CCTouch* }; #endif |
T25ScrollView.cpp |
#include CCScene *T25ScrollView::scene() { CCScene * scene = T25ScrollView * layer = scene->addChild(layer); return scene; } bool { TBack::init(); CCSize winSize = CCNode* node = _node = node; char buf[] = //注意:ScrollView中的每个元素实际上都是一个精灵 for (int i = 0; i < 5; ++i) { //创建精灵 CCSprite* s = //将精灵添加到node中去 node->addChild(s); s->setPosition(ccp(0, winSize.height*i)); s->setAnchorPoint(ccp(0, 0)); //设置标签 CCLabelTTF* label = buf[0]++; s->addChild(label); label->setPosition(ccp(winSize.width / 2, winSize.height / 2)); } //创建ScrollView,创建的时候需要node节点 CCScrollView* view = addChild(view); //设置滚动试图的显示方式,下面的设置表示的是垂直滚动 view->setDirection(kCCScrollViewDirectionVertical); //设置view的ContentSize,大小是5个精灵的高度 view->setContentSize(CCSizeMake(winSize.width, winSize.height * 5)); view->setBounceable(false);// setTouchEnabled(true); setTouchMode(kCCTouchesOneByOne); return } bool { return } //判断是否滚动了 bool { CCPoint ptCur = CCPoint ptStart = if (ptCur.getDistanceSq(ptStart) > 25) { return } return } void { //计算 CCSize winSize = int fitPos[] = { 0, -winSize.height, //向下移动一屏 -winSize.height * 2, //向下移动两屏 -winSize.height * 3, //向下移动三屏 -winSize.height * 4 //向下移动四屏 }; int y = _node->getPositionY(); int i; for (i = 0; i < 5; ++i) { int dist = abs(fitPos[i] - y); if (dist < winSize.height / 2) { break; } } //创建一个点 CCPoint ptDest = //让点移动到指定的位置 _node->runAction(CCMoveTo::create(.2f, ptDest)); } void { //判断点击的坐标,是哪个坐标 if (isSlider(t)) { //调整位置 scheduleOnce(schedule_selector(T25ScrollView::adjustViewPos), 0.05f); return; } //点击的代码 CCSize winSize = CCPoint ptWorld = //将世界坐标转化成为本地坐标 CCPoint ptNode = _node->convertToNodeSpace(ptWorld); int index = ptNode.y / winSize.height; CCLog("clicked index=%d", index); } |
运行结果(上下移动): |
1.httpClient和ScrollView的更多相关文章
- Android UI系列-----ScrollView和HorizontalScrollView
本篇随笔将讲解一下Android当中比较常用的两个布局容器--ScrollView和HorizontalScrollView,从字面意义上来看也是非常的简单的,ScrollView就是一个可以滚动的V ...
- Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- (一)----使用HttpClient发送HTTP请求(通过get方法获取数据)
(一)----使用HttpClient发送HTTP请求(通过get方法获取数据) 一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 “超文本传输协议”,是 ...
- HTTP基础与Android之(安卓与服务器通信)——使用HttpClient和HttpURLConnection
查看原文:http://blog.csdn.net/sinat_29912455/article/details/51122286 1客户端连接服务器实现内部的原理 GET方式和POST方式的差别 H ...
- URLConnection和HttpClient使用入门
本讲内容:URLConnection和HttpClient使用入门 在 Android中除了使用WebView控件访问网络以外,还有用代码方式访问网络的方法,代码方式有时候会显得更加灵活.本讲会介绍使 ...
- Android使用HTTP协议访问网络——HttpClient
套路篇 1.HttpClient是一个接口,因此无法创建它的实例,通常情况下都会创建一个DefaultHttpClient的实例 HttpClient httpClient=new DefaultHt ...
- Android之网络----使用HttpClient发送HTTP请求(通过get方法获取数据)
[正文] 一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层 ...
- 网络相关系列之中的一个:Android中使用HttpClient发送HTTP请求
一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是 ...
- Android网络(3):HttpClient作client,Tomcat Servlet作server的交互演示样例
前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后 ...
随机推荐
- mongo 服务化与删除
MONGO 服务化 使用超级用户进入cmd到D:\mongodb\bin> 日志文件需要提前创建 mongod --bind_ip 0.0.0.0 --logpath D:\mongodb\d ...
- LoadRunner菜鸟入门学习笔记
一.LR版本及浏览器选择 1.首先百度了一下LR各版本的浏览器兼容性 8.0 最高ie6 8.1 最高ie6 9.0 最高ie7 9.5 最高ie8 11.0 最高ie9( win7 32位+LR11 ...
- ●BOZJ 1927 [Sdoi2010]星际竞速
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1927 题解: 显然是个DAG 建图和有向图最小路径覆盖的建图有些相似. 都是拆点为 u u' ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- ●BZOJ 4710 [Jsoi2011]分特产
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4710 题解: 容斥,组合先看看这个方案数的计算:把 M 个相同的东西分给 N 个人,每个人可 ...
- [bzoj4881][Lydsy2017年5月月赛]线段游戏
来自FallDream的博客,未经允许,请勿转载,谢谢. quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1, ...
- spring boot新建项目问题总结
1.启动报:Unregistering JMX-exposed beans on shutdown 原因:以来的Tomcat没有启动 解决办法:在pom.xml加入依赖 <dependency& ...
- PostgreSQL 中如何实现group_concat
之前在MySQL中使用group_concat,觉得超级好用. 今天在PostgreSQL需要用到这样的场景,就去学习了一下. 在PostgreSQL中提供了arr_agg的函数来实现聚合,不过返回的 ...
- VS生成项目时,有些文件无法复制到输出目录的解决办法
有时候,我们在生成项目时,发现有些文件如:.jpg的图片文件,无法复制到输出目录中,此时会非常纠结,反复的清理项目,重新生成,依旧不能解决此问题.后来我打开.csproj的项目工程文件时,经过对比发现 ...
- electron-vue 初体验
注意事项 首先确保node和npm是最新版本 避免使用镜像(我淘宝镜像安装有报错现象) 避免window的一些坑 若上一项检查完成,我们可以继续设置所需的构建工具.使用 windows-build-t ...