日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HttpClient实现客户端与服务器的通信

發布時間:2024/7/23 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HttpClient实现客户端与服务器的通信 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇主要講解了利用HttpClient實現 windows主機與linux服務器的通信與傳遞數據

HttpClient代碼,服務器端配置

系統和安裝軟件
1)ubuntu 14.04 64位系統
2)sudo apt-get install apache2 sqlite3 libsqlite3-dev

配置apache 支持cgi

配置目錄 /etc/apache2
html頁面目錄 /var/www/html
cgi-bin目錄 /usr/lib/cgi-bin
日志文件 /var/log/apache2

1)/etc/apache2/mods-enable里增加支持cgi的mod

cd /etc/apache2/mods-enabled
sudo ln -s ../mods-available/cgid.conf
sudo ln -s ../mods-available/cgid.load
sudo ln -s ../mods-available/cgi.load

2) 編輯cgi代碼: /usr/lib/cgi-bin/setScore.c
sudo gcc /usr/lib/cgi-bin/setScore.c -o /usr/lib/cgi-bin/setScore.cgi

3) 建立數據庫
sudo sqlite3 /var/tank/tank.db
create table tscore (id integer primary key autoincrement, username varchar(32) unique not null, totalscore integer not null, score integer not null);

4) 修改數據庫文件的權限
sudo chmod 777 /var/tank -R
sudo chmod www-data:www-data /var/tank -R

CGI代碼如下,寫數據庫與讀數據庫并且向網頁打印返回

#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 0printf("This is cocos cgi-test\n");// 打印環境變量extern char** environ;int i;for(i=0; ;++i){if(environ[i])printf("%s\n<br>", environ[i]);elsebreak;}#endif// set Score to Databasechar* 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("/home/jjx/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 0printf("%s<br>", sql);return 0;#endifif(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;}

服務器端配置完成

客戶端發送數據代碼實現

//send http request ,send total score and score to serverint totalScore=CCUserDefault::sharedUserDefault()->getIntegerForKey("TotalScore");int score=CCUserDefault::sharedUserDefault()->getIntegerForKey("Score");int userid=CCRANDOM_0_1()*100;char url[2048];sprintf(url,"http://192.168.226.129/cgi-bin/setScore.cgi?totalscore=%d&score=%d&user=user%d",totalScore,score,userid);CCHttpClient *client=CCHttpClient::getInstance();CCHttpRequest *request=new CCHttpRequest;request->setUrl(url);request->setRequestType(CCHttpRequest::kHttpGet);request->setResponseCallback(this,httpresponse_selector(LayerScore::HttpResponse));client->send(request);request->release();

客戶端接收數據

//receive data from server//json data is most commonif (!response->isSucceed()){CCLOG("request error:%s",response->getErrorBuffer());return;}std::vector<char>* data=response->getResponseData();std::vector<char>::iterator it;std::string str;for(it=data->begin();it!=data->end();it++){str.push_back(*it); }char *p=new char[str.size()+1];strcpy(p,str.c_str());p[strlen(p)-1]=0;int index=0;char *username=strtok(p,"&"); char *totalScore;char *score;char buf[1024];while (username){totalScore=strtok(NULL,"&");score=strtok(NULL,"&");CCLOG("********%s,%s,%s********\n",username,totalScore,score);//put data into labelsCCLabelTTF *label=(CCLabelTTF*)getChildByTag(1000+index++);sprintf(buf,"%s:%s:%s",username,totalScore,score);label->setString(buf);username=strtok(NULL,"&");}delete []p;

HttpClient實現windwos主機與linux服務器通信并傳遞信息

以上是以DOGet方法,將參數設置在URL中以到達傳遞參數的作用,下面使用DOPost方法向服務器端上傳圖片

客戶端上傳代碼

CCHttpClient* client = CCHttpClient::getInstance();CCHttpRequest* req = new CCHttpRequest;req->setUrl("http://192.168.226.129/cgi-bin/posttest.cgi");req->setRequestType(CCHttpRequest::kHttpPost);req->setResponseCallback(this, httpresponse_selector(T24HttpClient::HttpResponse));char buf[8192];FILE* f = fopen("woman.png", "rb");int len = fread(buf, 1, 8192, f);fclose(f);CCLog("len=%d\n", len);req->setRequestData((const char*)buf, len);//req->setRequestData(buf,sizeof(buf));client->send(req);req->release();return true;

服務器端接收代碼

#include <stdio.h> #include <sqlite3.h> #include <string.h> #include <stdlib.h>int main() {printf("Content-type:text/html\n\n");int fd=creat("/home/jjx/tank/aaa.png");int len=atoi(getenv("CONTENT_LENGTH"));char *buf=malloc(len);fread(buf,len,1,stdin);write(fd,buf,len);close(fd);free(buf);printf("%s\n<br>",buf);return 0; }

上傳結束,可以在相應文件路徑下看到圖片

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的HttpClient实现客户端与服务器的通信的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。