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 [备注:开发后 ...
随机推荐
- 使用Keras对交通标志进行分类
# 使用Keras对交通标志进行分类 一.概述 本文主要记录的在使用Keras过程中,实现交通标志分类,数据集使用的是. 文本主要使用的环境为: Python3.5.2 Tensorflow 1.7 ...
- [NOIp 2009]靶形数独
Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他 ...
- POJ2454 Jersey Politics
Description In the newest census of Jersey Cows and Holstein Cows, Wisconsin cows have earned three ...
- 3064: Tyvj 1518 CPU监控
注意这题要维护历史最大加和历史最大覆盖 /************************************************************** Problem: 3064 Us ...
- ●POJ 1741 Tree
题链: http://poj.org/problem?id=1741题解: 树上点分治. 入门题,不多说了. 代码: #include<cstdio> #include<cstrin ...
- [bzoj4893]项链分赃
来自FallDream的博客,未经允许,请勿转载,谢谢. 有一串长度为n(n<=10^5)的项链,上面有红绿蓝三种颜色的珠子,每种颜色的珠子数目都是偶数,现在要你把它切几刀分成若干段,把其中一些 ...
- 如何彻底删除mysql
MySQL的卸载确实很让人头疼,很多时候都无法彻底卸载干净,这样会导致我们无法重新安装新的MySQL. 下面介绍,在Windows10系统下,如何彻底删除卸载MySQL... 1>停止MySQL ...
- EtherChannel(PAgP、LACP)基本配置--端口聚合--(转)
转自 http://blog.sina.com.cn/s/blog_635e1a9e01017msv.html EtherChannel EtherChannel(以太通道)也叫端口聚合或链路聚合,特 ...
- 在腾讯云的ubuntu服务器上面安装git服务器
GitHub是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用.搭建Git服 ...
- jquery easyui datagrid 排序列
点击排序列,将获取参数有:page=1&rows=10&sort=UserName&order=desc c#后台获取sort跟order参数 string sortColum ...