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
__T24HttpClient_H__

#define
__T24HttpClient_H__

#include
"cocos2d.h"

#include
"cocos-ext.h"

#include
"TBack.h"

USING_NS_CC;

USING_NS_CC_EXT;

class
T24HttpClient :public
TBack

{

public:

CREATE_FUNC(T24HttpClient);

bool init();

static
CCScene * scene();

void HttpResponse(CCHttpClient*
client, CCHttpResponse*
response);

};

#endif

T24HttpClient.cpp

#include
"T24HttpClient.h"

CCScene*
T24HttpClient::scene()

{

CCScene* scene =
CCScene::create();

T24HttpClient* layer =
T24HttpClient::create();

scene->addChild(layer);

return scene;

}

bool
T24HttpClient::init()

{

TBack::init();

//向服务器发送请求(http报文)单例

CCHttpClient* client =
CCHttpClient::getInstance();

//创建一个request对象

CCHttpRequest* request =
new CCHttpRequest();

//设置访问URL

request->setUrl("http://192.168.192.130/cgi-bin/setScore.cgi?username=xxx&score=xxxx&totalscore=xxx");

request->setResponseCallback(this,
httpresponse_selector(T24HttpClient::HttpResponse));

//要对client进行release

client->release();

return
true;

}

//通过回调的方式实现

void
T24HttpClient::HttpResponse(CCHttpClient*
client, CCHttpResponse*
response)

{

if (!response->isSucceed())

{

CCLog("response error: %s",
response->getErrorBuffer());

return;

}

//获得相应的数据

std::vector<char>* data =
response->getResponseData();

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
__HttpClientPost_H__

#define
__HttpClientPost_H__

#include
"cocos2d.h"

#include
"cocos-ext.h"

#include
"TBack.h"

USING_NS_CC;

USING_NS_CC_EXT;

class
HttpClientPost:public
TBack

{

public:

CREATE_FUNC(HttpClientPost);

bool init();

static
CCScene* scene();

void HttpResponse(CCHttpClient*
client, CCHttpResponse*
response);

};

#endif

HttpClientPost.cpp

#include
"HttpClientPost.h"

CCScene*
HttpClientPost::scene()

{

CCScene* scene =
CCScene::create();

HttpClientPost* layer =
HttpClientPost::create();

scene->addChild(layer);

return scene;

}

bool
HttpClientPost::init()

{

TBack::init();

//向服务器发送请求(http报文)

CCHttpClient* client =
CCHttpClient::getInstance();

CCHttpRequest* req =
new CCHttpRequest;

req->setUrl("http://192.168.192.131/cgi-bin/posttest.cgi");

req->setRequestType(CCHttpRequest::kHttpPost);

req->setResponseCallback(this,
httpresponse_selector(HttpClientPost::HttpResponse));

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
char*)buf,len);

client->send(req);

req->release();

return
true;

}

void
HttpClientPost::HttpResponse(CCHttpClient*
client, CCHttpResponse*
response)

{

//如果相应失败

if (!response->isSucceed())

{

//获取失败信息

CCLog("response error: %s",
response->getErrorBuffer());

return;

}

//获得相应的数据

std::vector<char>* data =
response->getResponseData();

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
__T25ScrollView_H__

#define
__T25ScrollView_H__

#include
"cocos2d.h"

#include
"cocos-ext.h"

#include
"TBack.h"

USING_NS_CC;

USING_NS_CC_EXT;

class
T25ScrollView :public
TBack

{

public:

CREATE_FUNC(T25ScrollView);

bool init();

static
CCScene * scene();

bool ccTouchBegan(CCTouch *pTouch,
CCEvent *pEvent);

void ccTouchEnded(CCTouch *pTouch,
CCEvent *pEvent);

void adjustViewPos(float
dt);

CCNode* _node;

bool isSlider(CCTouch*
t);

};

#endif

T25ScrollView.cpp

#include
"T25ScrollView.h"

CCScene *T25ScrollView::scene()

{

CCScene * scene =
CCScene::create();

T25ScrollView * layer =
T25ScrollView::create();

scene->addChild(layer);

return scene;

}

bool
T25ScrollView::init()

{

TBack::init();

CCSize winSize =
CCDirector::sharedDirector()->getWinSize();

CCNode* node =
CCNode::create();

_node = node;

char buf[] =
"a";

//注意:ScrollView中的每个元素实际上都是一个精灵

for (int i = 0; i < 5; ++i)

{

//创建精灵

CCSprite* s =
CCSprite::create("HelloWorld.png");

//将精灵添加到node中去

node->addChild(s);

s->setPosition(ccp(0, winSize.height*i));

s->setAnchorPoint(ccp(0, 0));

//设置标签

CCLabelTTF* label =
CCLabelTTF::create(buf,
"Arial", 24);

buf[0]++;

s->addChild(label);

label->setPosition(ccp(winSize.width / 2, winSize.height / 2));

}

//创建ScrollView,创建的时候需要node节点

CCScrollView* view =
CCScrollView::create(winSize, node);

addChild(view);

//设置滚动试图的显示方式,下面的设置表示的是垂直滚动

view->setDirection(kCCScrollViewDirectionVertical);

//设置view的ContentSize,大小是5个精灵的高度

view->setContentSize(CCSizeMake(winSize.width, winSize.height * 5));

view->setBounceable(false);//
去掉弹性

setTouchEnabled(true);

setTouchMode(kCCTouchesOneByOne);

return
true;

}

bool
T25ScrollView::ccTouchBegan(CCTouch *pTouch,
CCEvent *pEvent)

{

return
true;

}

//判断是否滚动了

bool
T25ScrollView::isSlider(CCTouch*
t)

{

CCPoint ptCur =
t->getLocation();

CCPoint ptStart =
t->getStartLocation();

if (ptCur.getDistanceSq(ptStart) > 25)

{

return
true;

}

return
false;

}

void
T25ScrollView::adjustViewPos(float
dt)

{

//计算

CCSize winSize =
CCDirector::sharedDirector()->getWinSize();

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 =
ccp(0, fitPos[i]);

//让点移动到指定的位置

_node->runAction(CCMoveTo::create(.2f, ptDest));

}

void
T25ScrollView::ccTouchEnded(CCTouch*
t, CCEvent*
e)

{

//判断点击的坐标,是哪个坐标

if (isSlider(t))

{

//调整位置

scheduleOnce(schedule_selector(T25ScrollView::adjustViewPos), 0.05f);

return;

}

//点击的代码

CCSize winSize =
CCDirector::sharedDirector()->getWinSize();

CCPoint ptWorld =
t->getLocation();

//将世界坐标转化成为本地坐标

CCPoint ptNode = _node->convertToNodeSpace(ptWorld);

int index = ptNode.y / winSize.height;

CCLog("clicked index=%d", index);

}

运行结果(上下移动):

1.httpClient和ScrollView的更多相关文章

  1. Android UI系列-----ScrollView和HorizontalScrollView

    本篇随笔将讲解一下Android当中比较常用的两个布局容器--ScrollView和HorizontalScrollView,从字面意义上来看也是非常的简单的,ScrollView就是一个可以滚动的V ...

  2. Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. (一)----使用HttpClient发送HTTP请求(通过get方法获取数据)

    (一)----使用HttpClient发送HTTP请求(通过get方法获取数据) 一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 “超文本传输协议”,是 ...

  4. HTTP基础与Android之(安卓与服务器通信)——使用HttpClient和HttpURLConnection

    查看原文:http://blog.csdn.net/sinat_29912455/article/details/51122286 1客户端连接服务器实现内部的原理 GET方式和POST方式的差别 H ...

  5. URLConnection和HttpClient使用入门

    本讲内容:URLConnection和HttpClient使用入门 在 Android中除了使用WebView控件访问网络以外,还有用代码方式访问网络的方法,代码方式有时候会显得更加灵活.本讲会介绍使 ...

  6. Android使用HTTP协议访问网络——HttpClient

    套路篇 1.HttpClient是一个接口,因此无法创建它的实例,通常情况下都会创建一个DefaultHttpClient的实例 HttpClient httpClient=new DefaultHt ...

  7. Android之网络----使用HttpClient发送HTTP请求(通过get方法获取数据)

    [正文] 一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层 ...

  8. 网络相关系列之中的一个:Android中使用HttpClient发送HTTP请求

    一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是 ...

  9. Android网络(3):HttpClient作client,Tomcat Servlet作server的交互演示样例

    前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后 ...

随机推荐

  1. postman学习笔记(一)——最简单的postman入门

    昨天开始正式接触postman的操作,最简单的操作是根据接口文档一个个测试接口. 例如: 测试环境地址:http://111.2.198.4(项目组自己的测试环境,要测试的项目组肯定会给你的) //以 ...

  2. Oracle RAC环境下定位并杀掉最终阻塞的会话-续

    之前在<Oracle RAC环境下定位并杀掉最终阻塞的会话>中,最终使用一个SQL查询出RAC实例之间的所有阻塞关系.但是实际在某些极端的生产环境,是不允许执行复杂的SQL语句,即使允许执 ...

  3. [Luogu 3674]小清新人渣的本愿

    Description 题库链接 给你一个序列 \(A\) ,长度为 \(n\) ,有 \(m\) 次操作,每次询问一个区间是否可以 选出两个数它们的差为 \(x\) : 选出两个数它们的和为 \(x ...

  4. [USACO09FEB]庙会班车Fair Shuttle

    题目描述 逛逛集市,兑兑奖品,看看节目对农夫约翰来说不算什么,可是他的奶牛们非常缺乏锻炼——如果要逛完一整天的集市,他们一定会筋疲力尽的.所以为了让奶牛们也能愉快地逛集市,约翰准备让奶牛们在集市上以车 ...

  5. [BZOJ]2589: Spoj 10707 Count on a tree II

    Time Limit: 20 Sec  Memory Limit: 400 MB Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v),你需要回答u xor last ...

  6. ●BOZJ 3144 [Hnoi2013]切糕

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3144 题解: "这是一个经典的最小割模型" ---引用自别人的博客 .. ...

  7. C语言预备作业

    一.关于师生关系 第一种:我认为师生关系不是仅仅的餐馆与食客的关系,因为食客可以给餐馆评分,也可以选择是否继续在这里吃,但是学生却不可以选择老师,因为老师是传授知识的,无法由自己来选择.而学生是需要完 ...

  8. seq2seq-chatbot:200 行代码实现聊天机器人

    Chatbot in 200 lines of code CPU 跑不动 github:https://github.com/zsdonghao/seq2seq-chatbot 更多英文,中文聊天机器 ...

  9. 阿里 & 酷家乐:实习生面试

    最近海投了十家公司,暂时有阿里两面(已凉).酷家乐两面(大概凉了).网易一面.前两个都是基础知识发挥得还可以,两家公司二面都凉凉. 阿里一面(3.21 26min) 刚好买了中饭回宿舍打开正准备吃的时 ...

  10. [Java] 设计模式:代码形状 - lambda表达式的一个应用

    [Java] 设计模式:代码形状 - lambda表达式的一个应用 Code Shape 模式 这里介绍一个模式:Code Shape.没听过,不要紧,我刚刚才起的名字. 作用 在应用程序的开发中,我 ...