Socket實(shí)現(xiàn)HTTP客戶端
??? 前些日子用 Wininet做項(xiàng)目。功能忒強(qiáng)大了。但總覺(jué)得管理Cookie有點(diǎn)不方便。即使設(shè)置了自己手動(dòng)管理Cookies。這天上掉餡餅的事還真的常常發(fā)生。比如你之前用瀏覽器訪問(wèn)了這個(gè)站,留下了Cookie 你再用wininet訪問(wèn)的時(shí)候,這個(gè)餡餅就出現(xiàn)了。
?
?? 封包不難 連接后。將 Headers一股腦堆進(jìn)去。2個(gè)換行符后就是數(shù)據(jù)了(POST才有)。
?
?? 服務(wù)器返回的數(shù)據(jù),怎么知道長(zhǎng)度呢?我們知道的有Content-Length頭。但抓包發(fā)現(xiàn)。有些靜態(tài)文件是沒(méi)有的。它的這個(gè)長(zhǎng)度保存在2個(gè)換行符之后。單獨(dú)的一行以十六進(jìn)制文本的格式保存。
?
比如:
HTTP/1.1 200 OK
Date: Sat, 04 Jul 2009 17:41:10 GMT
Server: Apache
Pragma: no-cache
Connection: Keep-Alive
Content-Type: text/plain
?
?
2f8
......
這里紅色的2f8就是哦body的長(zhǎng)度了。
?
控制連接行為的還有一個(gè)就是 Connection 頭 如果是 Keep-Alive,則一次請(qǐng)求完畢后不要斷開(kāi)連接。我這里的做法是保存了上一次的域名和端口。如果上次請(qǐng)求有 Keep-Alive 而且域名和端口沒(méi)變的情況下。沒(méi)必要重新連接。
?
數(shù)據(jù)包的處理搞定了后。就是一些接口的封裝了。在這里需要注意一些細(xì)節(jié)是。所有協(xié)議頭不的單詞的第一個(gè)字母是大寫的。封裝的時(shí)候沒(méi)注意,走了不少?gòu)澛贰?/p>
?
到這里已經(jīng)基本滿足我的項(xiàng)目需求了。用它做個(gè)QQ帳號(hào)注冊(cè)器。速度飛快。也不會(huì)出現(xiàn)“非法訪問(wèn)”了。爽!
?
最后一個(gè)問(wèn)題是編碼識(shí)別和處理了。如果是 text 就必須有編碼識(shí)別了。這部分還沒(méi)實(shí)現(xiàn)。沒(méi)找到好的解決辦法。
?
?
?
注:上面的內(nèi)容用易語(yǔ)言實(shí)現(xiàn)。需要源碼可以聯(lián)系我.