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
__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);

}


运行结果(上下移动):

 

 

时间: 2024-07-30 18:29:30

1.httpClient和ScrollView的相关文章

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

[正文]  一.HTTP协议初探: HTTP(Hypertext Transfer Protocol)中文 "超文本传输协议",是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议,是Internet上目前使用最广泛的应用层协议,它基于传输层的TCP协议进行通信,HTTP协议是通用的.无状态的协议. 这几个名词有一种通俗的解释: 通讯协议:双方对话的标准 通用的:用了都说好,谁用谁知道 无状态的:翻脸不认人 超文本:除了文本,还可以是音频.视频 HTTP协议与Android开发

Android UI系列-----ScrollView和HorizontalScrollView的详解_Android

本篇随笔将讲解一下Android当中比较常用的两个布局容器--ScrollView和HorizontalScrollView,从字面意义上来看也是非常的简单的,ScrollView就是一个可以滚动的View,这个滚动的方向是垂直方向的,而HorizontalScrollView则是一个水平方向的可以滚动的View.本篇随笔可能描述性的知识比较少,最主要还是通过代码来看看如何使用这两个View. 一.ScrollView的简单介绍 首先来看看ScrollView和HorizontalScrollV

Android UI系列-----ScrollView和HorizontalScrollView的详解

本篇随笔将讲解一下Android当中比较常用的两个布局容器--ScrollView和HorizontalScrollView,从字面意义上来看也是非常的简单的,ScrollView就是一个可以滚动的View,这个滚动的方向是垂直方向的,而HorizontalScrollView则是一个水平方向的可以滚动的View.本篇随笔可能描述性的知识比较少,最主要还是通过代码来看看如何使用这两个View. 一.ScrollView的简单介绍 首先来看看ScrollView和HorizontalScrollV

ViewPager在ScrollView中无法正常滑动的问题

来源: 能够兼容ViewPager的ScrollView http://justwyy.iteye.com/blog/1567390 ScrollView中嵌入ViewPager,ViewPager的滑动出现问题  http://bbs.csdn.net/topics/390213480 在网上找到两种方法,都是自定义scrollview,大家可以试试. 方法一: public class CustomScrollView extends ScrollView { private boolean

关于commons.httpclient.HttpClient和http.client.HttpClient的区别!!!

问题描述 关于commons.httpclient.HttpClient和http.client.HttpClient的区别!!! 这两个包都是apache提供网络请求的, 请问具体区别... 很纠结,不知道用哪个最合适,org.apache.http.client.HttpClient但我觉得这个包的更专业,不确定,希望大家回答下. 标题太长 我去掉了一些

不借助第三方插件利用ScrollView自身delegate实现下拉刷新和上拉加载

下拉刷新功能基本上在所有的app中都会被用到,而且这个功能已经被apple集成进去了,不过必须得是在tableViewController中才有,是一个叫做UIRefreshControl的控件,想看效果可以看手机QQ上面联系人列表下拉后的刷新.这里不多介绍. 本篇blog主要介绍如何在scrollview中实现下拉刷新的效果.因为有些时候我们可能更多地希望直接在scrollview中展现,而不是一定要局限于tableviewcontroller. 当然网上有很多下拉刷新和上拉加载的第三方控件,

安卓 网络-为什么我用httpclient访问不到网络呢

问题描述 为什么我用httpclient访问不到网络呢 public class MainActivity extends Activity { public static final int SHOW_RESPONSE=1; TextView text; private Handler handler=new Handler(); public void handleMessage(Message msg){ switch(msg.what){ case SHOW_RESPONSE: Stri

7.1.4 ScrollView结合案例详解

ScrollView是一个滚动条控件,当屏幕中内容很多时候需要使用滚动条.ScrollView类的继承图如下:java.lang.Object   ↳android.view.View    ↳android.view.ViewGroup    ↳android.widget.FrameLayout    ↳android.widget.ScrollViewandroid.widget.ScrollView继承了android.widget.FrameLayout框架布局类.ScrollView

android httpclient处理网络异常

问题描述 android httpclient处理网络异常 如题,如何设置网络超时,或网络异常,并且提示用户异常,哪位大侠,给个详细代码,感激不进 解决方案 转载自: ? ? ? ? ? ??http://android.tgbus.com/Android/tutorial/201108/364645.shtml ? (Android开发实现HttpClient工具类) ? ? ? ? ??http://www.open-open.com/lib/view/open1329101420890.h