最近项目之中需要一个大家比较的熟悉的COOKIE,这是做为客户端与服务端交互的一个信用凭证。当建立连接后,服务器第一次会发放一个信用凭证COOKIE给客户端,那么下次客户端访问服务器的时候,只要带上自己的COOKIE信息,服务器就不会再次生成COOKIE信息,这次会话连接就算Ok了。如果客户端的信息发生了变化,那么post服务器数据发生变化,服务器会重新发送COOKIE给客户端,重新建立会话连接。
首先补充点,COOKIE的基本信息。COOKIE一词用在程序设计中是一种能够让网站服务器把少量数据储存到客户端,
的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。从本质上讲,它可以看作是你的身份证。保存的信息片断以"名/值"对(name-value pairs)的形式储存,一个"名/值"对仅仅是一条命名的数据。
一个网站只能取得它放在你的电脑中的信息,它无法从其它的Cookies文件中取得信息,也无法得到你的电脑上的其它任何东西。 Cookies中的内容大多数经过了加密处理,因此一般用户看来只是一些毫无意义的字母数字组合,只有服务器的CGI处理程序才知道它们真正的含义。
由于Cookies是我们浏览的网站传输到用户计算机硬盘中的文本文件或内存中的数据,因此它在硬盘中存放的位置与使用的操作系统和浏览器密切相关。在Windows 9X系统计算机中,Cookies文件的存放位置为C:/Windows/Cookies,在Windows NT/2000/XP的计算机中,Cookies文件的存放位置为C:/Documents and Settings/用户名/Cookies,在Windows Vista/7的计算机中,Cookies文件的存放位置为C:\Users\user\AppData\Roaming\Microsoft\Windows\Cookies\Low。
硬盘中的Cookies文件可以被Web浏览器读取,它的命令格式为:用户名@网站地址[数字].txt。如笔者计算机中的一个Cookies文件名为:ch@163[1].txt。要注意的是:硬盘中的Cookies属于文本文件,不是程序。
好的,第二步介绍我们使用的工具是Curl和Cocos2d—X游戏开发引擎。下面直接看代码分析:
void HelloWorld::beginRequest()
{
FILE *fp = fopen("/Users/kevin/Desktop/test.txt", "ab");
string filePath = "/Users/kevin/Desktop/test.txt";
//char *temp;
//测试多线程请求,不知为何仍是不行
/*CURLM *multiHandle = curl_multi_init();
CURL *easyHandle1,*easyHandle2;
int requerstCount;
easyHandle1 = curl_easy_init();
easyHandle2 = curl_easy_init();
if (easyHandle1 && easyHandle2) {
curl_easy_setopt(easyHandle1, CURLOPT_URL, this->serverIP1.c_str());
curl_easy_setopt(easyHandle1, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(easyHandle1, CURLOPT_WRITEDATA, &fp);
curl_easy_setopt(easyHandle1, CURLOPT_WRITEFUNCTION, HelloWorld::writeData);
curl_easy_setopt(easyHandle2, CURLOPT_URL,this->serverIP1.c_str());
curl_easy_setopt(easyHandle2, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(easyHandle1, CURLOPT_WRITEDATA, &fp);
curl_easy_setopt(easyHandle2, CURLOPT_WRITEFUNCTION, HelloWorld::writeData);
curl_easy_perform(easyHandle1);
curl_easy_perform(easyHandle2);
curl_multi_add_handle(multiHandle, easyHandle1);
curl_multi_add_handle(multiHandle, easyHandle2);
curl_multi_setopt(multiHandle, CURLMOPT_MAXCONNECTS, 100);
curl_multi_perform(multiHandle, &requerstCount);
fclose(fp);
curl_easy_cleanup(easyHandle1);
curl_easy_cleanup(easyHandle2);
curl_multi_cleanup(multiHandle);
}*/
char *postData = "lx=1";
char *postData1 = "un=Player_65049&pw=";
CURL *easyHandle1 = curl_easy_init();
if (easyHandle1) {
curl_easy_setopt(easyHandle1, CURLOPT_URL, this->serverIP5 .c_str());
curl_easy_setopt(easyHandle1, CURLOPT_POSTFIELDS, postData1);
//1.CURLOPT_COOKIE--手动添加cookie,以分号作为结尾
//curl_easy_setopt(easyHandle1, CURLOPT_COOKIE, "JSESSIONID=CCB8610A181C98BE95308574F99D1279.jvm1;jforumUserId=43;jforumAutoLogin=1;jforumUserHash=663d669fe871afd8267becb6363cc27a;");
//2.CURLOPT_COOKIEJAR--本地存储cookie文件,是 Netscape HTTP Cookie File格式
//而且在开始curl连接后,开始将http头文件的cookie文件解析后存储刀本地文件夹
//curl会自动判读cookie文件的情况,若不存在,才会存储
curl_easy_setopt(easyHandle1, CURLOPT_COOKIEJAR,filePath.c_str());
//3.CURLOPT_COOKIEFILE---curl自动从本地的cookie文件里面读取所有的数据,
//并且会自动添加到请求的http头文件里面,作为与服务器交互的信用凭据
curl_easy_setopt(easyHandle1, CURLOPT_COOKIEFILE,filePath.c_str());
curl_easy_setopt(easyHandle1, CURLOPT_VERBOSE, 1L);
curl_easy_setopt(easyHandle1, CURLOPT_WRITEFUNCTION, HelloWorld::writeData);
}
curl_easy_perform(easyHandle1);
curl_easy_cleanup(easyHandle1);
fclose(fp);
}
好的,来看下Curl的版本输出内容吧,嘎嘎。
* About to connect() to 192.168.1.5 port 80 (#0)
* Trying 192.168.1.5...
* connected
* Connected to 192.168.1.5 (192.168.1.5) port 80 (#0)
> POST /jforum?module=user&action=sjlogin HTTP/1.1
Host: 192.168.1.5
Accept: */*
Cookie: jforumUserHash=e45b9fdeffc6cad348142f6dd868b919; jforumAutoLogin=1; jforumUserId=39; JSESSIONID=838C7E384B72A2CB9EF23D5685CC6989.jvm1
Content-Length: 19
Content-Type: application/x-www-form-urlencoded
* upload completely sent off: 19 out of 19 bytes
< HTTP/1.1 200 OK
* Replaced cookie JSESSIONID="3725401C7552496D087AFBF0BBAC76C7.jvm1" for domain 192.168.1.5, path /, expire 0
< Set-Cookie: JSESSIONID=3725401C7552496D087AFBF0BBAC76C7.jvm1; Path=/
* Replaced cookie jforumAutoLogin="1" for domain 192.168.1.5, path /, expire 1404958821
< Set-Cookie: jforumAutoLogin=1; Expires=Thu, 10-Jul-2014 02:20:21 GMT; Path=/
* Replaced cookie jforumUserHash="8316f5d96375db86927e6ff2048c57ad" for domain 192.168.1.5, path /, expire 1404958821
< Set-Cookie: jforumUserHash=8316f5d96375db86927e6ff2048c57ad; Expires=Thu, 10-Jul-2014 02:20:21 GMT; Path=/
* Replaced cookie jforumUserId="39" for domain 192.168.1.5, path /, expire 1404958821
< Set-Cookie: jforumUserId=39; Expires=Thu, 10-Jul-2014 02:20:21 GMT; Path=/
< Content-Type: text/html;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Wed, 10 Jul 2013 02:20:21 GMT
< Server: Apache-Coyote/1.1
<
# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.
192.168.1.5 FALSE / FALSE 0 JSESSIONID 838C7E384B72A2CB9EF23D5685CC6989.jvm1
192.168.1.5 FALSE / FALSE 1404908184 jforumUserId 39
192.168.1.5 FALSE / FALSE 1404908184 jforumAutoLogin 1
192.168.1.5 FALSE / FALSE 1404908184 jforumUserHash e45b9fdeffc6cad348142f6dd868b919
这样以后每次的会话只要有cookie就可以了。
在curl遇到奇怪的问题,最好要打开调试选项,而且可以结合火狐浏览器的httpfox插件
- curl_easy_setopt(m_pCurl, CURLOPT_DEBUGFUNCTION, CurlDebug);//打印完整的调试信息
- curl_easy_setopt(m_pCurl, CURLOPT_VERBOSE, 1);//打印调试信息
//curl_easy_setopt(handle,CURLOPT_COOKIEJAR, (CCFileUtils::sharedFileUtils()->getWritablePath()+"ccokie.txt").c_str());
//curl_easy_setopt(handle,CURLOPT_COOKIEFILE, (CCFileUtils::sharedFileUtils()->getWritablePath() + "ccokie.txt").c_str());
//curl_easy_setopt(handle,CURLOPT_VERBOSE,1L);//调试信息