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 [备注:开发后 ...
随机推荐
- 深入探索.NET框架内部了解CLR如何创建运行时对象
原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集 ...
- brk和mmap(转)
进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap: 1.brk是将数据段的(.data)的最高地址指针_edata往高地址推 2.mmap是虚拟地址空间找一个空闲的虚拟内存 如果mal ...
- bzoj 3924: [Zjoi2015]幻想乡战略游戏
Description 傲娇少女幽香正在玩一个非常有趣的战略类游戏,本来这个游戏的地图其实还不算太大,幽香还能管得过来,但是不知道为什么现在的网游厂商把游戏的地图越做越大,以至于幽香一眼根本看不过来, ...
- 2015 多校联赛 ——HDU5319(模拟)
Painter Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Su ...
- 【HDU 2966 k-dimensional Tree 入个门】
·“k-d树是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的范围搜索和最近邻搜索……”’' ·英文题,述大意: 给出平面内n个点(n<=100000,0<=x, ...
- Delphi7通过SendMessage来实现默认打印机的切换
具体代码 procedure SetDefaultPrinter(NewDefPrinter: string); var ResStr: array[0..255] of Char; begin St ...
- C语言程序设计第一次作业 冯亚杰
(一)实验总结 求圆面积和周长 (1)题目 输入圆的半径,计算圆的周长和面积. (2)流程图 (3)测试数据及运行结果 测试数据1:r=7 运行结果: 测试数据2:r=5 运行结果: (4)实验分析 ...
- div,margin,padding
<!-- 类比礼品盒里装方块月饼.月饼的食用部分(我们把它称之为月饼肉身)要装在小包装盒里,月饼肉身即为content.月饼肉身与直接包裹它的小包装盒(我们把它叫做月饼的衣服)之间的距离叫pad ...
- 实现一个ordeeddict
class MyOrderdict(): def __init__(self, mydict): self._cur = 0 self._mykeys = [] self._myvalues = [] ...
- DecimalFormat(用于格式化十进制数字)
1概念: DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字.该类设计有各种功能,使其能够分析和格式化任意语言环境中的数,包括对西方语言.阿拉伯语和印度语数 ...