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

冷不防 2022-08-20 13:23 380阅读 0赞

本篇主要讲解了利用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代码如下,写数据库与读数据库并且向网页打印返回

  1. #include <stdio.h>
  2. #include <sqlite3.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. int selectCallback(void* arg,int argc,char** argv,char** argvv)
  6. {
  7. //argv[0] id
  8. //argv[1] username
  9. //argv[2] totalscore
  10. //argv[3] score
  11. // username&totalscore&score&....
  12. printf("%s&%s&%s&", argv[1], argv[2], argv[3]);
  13. return 0;
  14. }
  15. int main()
  16. {
  17. printf("Content-type:text/html\n\n");
  18. #if 0
  19. printf("This is cocos cgi-test\n");
  20. // 打印环境变量
  21. extern char** environ;
  22. int i;
  23. for(i=0; ;++i)
  24. {
  25. if(environ[i])
  26. printf("%s\n<br>", environ[i]);
  27. else
  28. break;
  29. }
  30. #endif
  31. // set Score to Database
  32. char* queryString = getenv("QUERY_STRING");
  33. if(queryString == NULL)
  34. {
  35. printf("Err: queryString is NULL");
  36. return 0;
  37. }
  38. // totalscore=%d&score=%d&user=user%d
  39. // 获取参数
  40. char* totalScore = strtok(queryString, "&");
  41. char* score = strtok(NULL, "&");
  42. char* username = strtok(NULL, "&");
  43. strtok(totalScore, "=");
  44. totalScore = strtok(NULL, "=");
  45. strtok(score, "=");
  46. score = strtok(NULL, "=");
  47. strtok(username, "=");
  48. username = strtok(NULL, "=");
  49. // 写数据库
  50. sqlite3* db;
  51. int ret = sqlite3_open("/home/jjx/tank.db", &db);
  52. if(ret != SQLITE_OK)
  53. {
  54. printf("open database error: %s", sqlite3_errstr(sqlite3_errcode(db)));
  55. return 0;
  56. }
  57. char sql[2048];
  58. sprintf(sql, "insert into tscore (username, totalscore, score) values ('%s', %s, %s)",
  59. username, totalScore, score);
  60. ret = sqlite3_exec(db, sql, NULL, NULL, NULL);
  61. #if 0
  62. printf("%s<br>", sql);
  63. return 0;
  64. #endif
  65. if(ret != SQLITE_OK)
  66. {
  67. printf("insert data error: %s", sqlite3_errstr(sqlite3_errcode(db)));
  68. sqlite3_close(db);
  69. return 0;
  70. }
  71. sprintf(sql, "select * from tscore order by totalscore desc limit 10");
  72. ret = sqlite3_exec(db, sql, selectCallback, NULL, NULL);
  73. if(ret != SQLITE_OK)
  74. {
  75. printf("select data error: %s", sqlite3_errstr(sqlite3_errcode(db)));
  76. sqlite3_close(db);
  77. return 0;
  78. }
  79. sqlite3_close(db);
  80. return 0;
  81. }

服务器端配置完成

客户端发送数据代码实现

  1. //send http request ,send total score and score to server
  2. int totalScore=CCUserDefault::sharedUserDefault()->getIntegerForKey("TotalScore");
  3. int score=CCUserDefault::sharedUserDefault()->getIntegerForKey("Score");
  4. int userid=CCRANDOM_0_1()*100;
  5. char url[2048];
  6. sprintf(url,"http://192.168.226.129/cgi-bin/setScore.cgi?totalscore=%d&score=%d&user=user%d",totalScore,score,userid);
  7. CCHttpClient *client=CCHttpClient::getInstance();
  8. CCHttpRequest *request=new CCHttpRequest;
  9. request->setUrl(url);
  10. request->setRequestType(CCHttpRequest::kHttpGet);
  11. request->setResponseCallback(this,httpresponse_selector(LayerScore::HttpResponse));
  12. client->send(request);
  13. request->release();

客户端接收数据

  1. //receive data from server
  2. //json data is most common
  3. if (!response->isSucceed())
  4. {
  5. CCLOG("request error:%s",response->getErrorBuffer());
  6. return;
  7. }
  8. std::vector<char>* data=response->getResponseData();
  9. std::vector<char>::iterator it;
  10. std::string str;
  11. for(it=data->begin();it!=data->end();it++)
  12. {
  13. str.push_back(*it);
  14. }
  15. char *p=new char[str.size()+1];
  16. strcpy(p,str.c_str());
  17. p[strlen(p)-1]=0;
  18. int index=0;
  19. char *username=strtok(p,"&");
  20. char *totalScore;
  21. char *score;
  22. char buf[1024];
  23. while (username)
  24. {
  25. totalScore=strtok(NULL,"&");
  26. score=strtok(NULL,"&");
  27. CCLOG("********%s,%s,%s********\n",username,totalScore,score);
  28. //put data into labels
  29. CCLabelTTF *label=(CCLabelTTF*)getChildByTag(1000+index++);
  30. sprintf(buf,"%s:%s:%s",username,totalScore,score);
  31. label->setString(buf);
  32. username=strtok(NULL,"&");
  33. }
  34. delete []p;

HttpClient实现windwos主机与linux服务器通信并传递信息

以上是以DOGet方法,将参数设置在URL中以到达传递参数的作用,下面使用DOPost方法向服务器端上传图片

客户端上传代码

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

服务器端接收代码

  1. #include <stdio.h>
  2. #include <sqlite3.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. int main()
  6. {
  7. printf("Content-type:text/html\n\n");
  8. int fd=creat("/home/jjx/tank/aaa.png");
  9. int len=atoi(getenv("CONTENT_LENGTH"));
  10. char *buf=malloc(len);
  11. fread(buf,len,1,stdin);
  12. write(fd,buf,len);
  13. close(fd);
  14. free(buf);
  15. printf("%s\n<br>",buf);
  16. return 0;
  17. }

上传结束,可以在相应文件路径下看到图片

发表评论

表情:
评论列表 (有 0 条评论,380人围观)

还没有评论,来说两句吧...

相关阅读

    相关 客户服务器程序通信

    在介绍客户端和服务器通信方式之前,首先要介绍一下网络通信的模型。先了解通信模型,然后再了解通信方式。 一、通信模型        目前主流的网络通信模型有以下两种: