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. [ Java学习基础 ] String、StringBuffer、StringBuilder比较学习

    首先讲获得字符串对象的方式有两种,一种是直接使用字符串常量,一种是使用new关键字创建,但它们之间是有一些区别,如下运行实例: String s1 = new String("Hello&q ...

  2. STM32 - GPIO

    买了一个STM32F4的开发板,想把上面的东西重新学一下 快速过: 一.GPIO控制 void GPIO_DeInit(GPIO_TypeDef* GPIOx); //把某一个IO口恢复到默认值 /* ...

  3. 获取Avrix上Computer Vision and Pattern Recognition的论文,进一步进行统计分析。

    此文主要记录我在18年寒假期间,收集Avrix论文的总结 寒假生活题外   在寒假期间,爸妈每天让我每天跟着他们6点起床,一起吃早点收拾,每天7点也就都收拾差不多.   早晨的时光是人最清醒的时刻,而 ...

  4. Basic command and advice for memcached

    Storage Commands set Most common command. Store this data, possibly overwriting any existing data. N ...

  5. 成也DP,败也DP(AFO?)

    不知道想说什么.. 从来没写过博客,markdown什么的也不会,凑合着看一下吧. 初中的时候开始搞OI,学了两个月后普及组爆零就退赛了. 初三直升的时候说每个人都要选竞赛,抱着混一混的心态选了信息, ...

  6. 2014-10-30NOIP复习题1

    Problem 1 Graph (graph.cpp/c/pas) [题目描述] 给出 N 个点,M 条边的有向图,对于每个点 v,求 A(v) 表示从点 v 出发,能到达的编号最大的点. [输入格式 ...

  7. Codeforces Round #401 (Div. 2)

    和FallDream dalao一起从学长那借了个小号打Div2,他切ABE我做CD,我这里就写下CD题解,剩下的戳这里 AC:All Rank:33 小号Rating:1539+217->17 ...

  8. spoj 1676 AC自动机+矩阵快速

    Text Generator Time Limit: 1386MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submi ...

  9. *hdu 5536(字典树的运用)

    Input The first line of input contains an integer T indicating the total number of test cases. The f ...

  10. 笔记11 在XML中声明切面(2)

    为通知传递参数 1.声明一个CompactDiscs接口.内部包含两个方法: show() 用于显示唱片的名字和艺术风格 playTrack(int number) 根据传入的磁道数播放相应磁道的音乐 ...