java技巧-傳輸協(xié)議_第1頁
java技巧-傳輸協(xié)議_第2頁
java技巧-傳輸協(xié)議_第3頁
java技巧-傳輸協(xié)議_第4頁
java技巧-傳輸協(xié)議_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、傳輸協(xié)議TCP/IP三次握手,建立連接四次揮手,斷開連接層次結(jié)構(gòu)TCP/IPOSI應(yīng)用層應(yīng)用層表示層會(huì)話層主機(jī)到主機(jī)層(TCP)(又稱傳輸層)傳輸層網(wǎng)絡(luò)層(IP)(又稱互聯(lián)層)網(wǎng)絡(luò)層網(wǎng)絡(luò)接口層(又稱鏈路層)數(shù)據(jù)鏈路層物理層TCP三次握手所謂三次握手(Three-way Handshake),是指建立一個(gè)TCP連接時(shí),需要客戶端和服務(wù)器總共發(fā)送3個(gè)包。三次握手的目的是連接服務(wù)器指定端口,建立TCP連接,并同步連接雙方的序列號(hào)和確認(rèn)號(hào)并交換 TCP 窗口大小信息.在socket編程中,客戶端執(zhí)行connect()時(shí)。將觸發(fā)三次握手。 · 第一次握手:客戶端發(fā)送一個(gè)TCP的SYN標(biāo)志位置1

2、的包指明客戶打算連接的服務(wù)器的端口,以及初始序號(hào)X,保存在包頭的序列號(hào)(Sequence Number)字段里。· 第二次握手:服務(wù)器發(fā)回確認(rèn)包(ACK)應(yīng)答。即SYN標(biāo)志位和ACK標(biāo)志位均為1同時(shí),將確認(rèn)序號(hào)(Acknowledgement Number)設(shè)置為客戶的I S N加1以.即X+1。· 第三次握手.客戶端再次發(fā)送確認(rèn)包(ACK) SYN標(biāo)志位為0,ACK標(biāo)志位為1.并且把服務(wù)器發(fā)來ACK的序號(hào)字段+1,放在確定字段中發(fā)送給對(duì)方.并且在數(shù)據(jù)段放寫ISN的+1SYN攻擊 在三次握手過程中,服務(wù)器發(fā)送SYN-ACK之后,收到客戶端的ACK之前的TCP連接稱為半連接(

3、half-open connect).此時(shí)服務(wù)器處于Syn_RECV狀態(tài).當(dāng)收到ACK后,服務(wù)器轉(zhuǎn)入ESTABLISHED狀態(tài). Syn攻擊就是 攻擊客戶端 在短時(shí)間內(nèi)偽造大量不存在的IP地址,向服務(wù)器不斷地發(fā)送syn包,服務(wù)器回復(fù)確認(rèn)包,并等待客戶的確認(rèn),由于源地址是不存在的,服務(wù)器需要不斷的重發(fā)直 至超時(shí),這些偽造的SYN包將長(zhǎng)時(shí)間占用未連接隊(duì)列,正常的SYN請(qǐng)求被丟棄,目標(biāo)系統(tǒng)運(yùn)行緩慢,嚴(yán)重者引起網(wǎng)絡(luò)堵塞甚至系統(tǒng)癱瘓。 Syn攻擊是一個(gè)典型的DDOS攻擊。檢測(cè)SYN攻擊非常的方便,當(dāng)你在服務(wù)器上看到大量的半連接狀態(tài)時(shí),特別是源IP地址是隨機(jī)的,基本上可以斷定這是一次SYN攻擊.在Linu

4、x下可以如下命令檢測(cè)是否被Syn攻擊netstat -n -p TCP | grep SYN_RECV一般較新的TCP/IP協(xié)議棧都對(duì)這一過程進(jìn)行修正來防范Syn攻擊,修改tcp協(xié)議實(shí)現(xiàn)。主要方法有SynAttackProtect保護(hù)機(jī)制、SYN cookies技術(shù)、增加最大半連接和縮短超時(shí)時(shí)間等.但是不能完全防范syn攻擊。TCP 四次揮手TCP的連接的拆除需要發(fā)送四個(gè)包,因此稱為四次揮手(four-way handshake)??蛻舳嘶蚍?wù)器均可主動(dòng)發(fā)起揮手動(dòng)作,在socket編程中,任何一方執(zhí)行close()操作即可產(chǎn)生揮手操作。參見wireshark抓包,實(shí)測(cè)的抓包結(jié)果并沒有嚴(yán)格按揮手

5、時(shí)序。我估計(jì)是時(shí)間間隔太短造成。UDPTCP/IP與UDP區(qū)別TCP/IP協(xié)議時(shí)面向連接,UDP面向非連接TCP/IP編程ServerSocket,SocketHttp詳解HTTP協(xié)議詳解之請(qǐng)求篇 http請(qǐng)求由三部分組成,分別是:請(qǐng)求行、消息報(bào)頭、請(qǐng)求正文1、請(qǐng)求行以一個(gè)方法符號(hào)開頭,以空格分開,后面跟著請(qǐng)求的URI和協(xié)議的版本,格式如下:Method Request-URI HTTP-Version CRLF 其中 Method表示請(qǐng)求方法;Request-URI是一個(gè)統(tǒng)一資源標(biāo)識(shí)符;HTTP-Version表示請(qǐng)求的HTTP協(xié)議版本;CRLF表示回車和換行(除了作為結(jié)尾的CRLF外,不允

6、許出現(xiàn)單獨(dú)的CR或LF字符)。請(qǐng)求方法(所有方法全為大寫)有多種,各個(gè)方法的解釋如下:GET 請(qǐng)求獲取Request-URI所標(biāo)識(shí)的資源POST 在Request-URI所標(biāo)識(shí)的資源后附加新的數(shù)據(jù)HEAD 請(qǐng)求獲取由Request-URI所標(biāo)識(shí)的資源的響應(yīng)消息報(bào)頭PUT 請(qǐng)求服務(wù)器存儲(chǔ)一個(gè)資源,并用Request-URI作為其標(biāo)識(shí)DELETE 請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源TRACE 請(qǐng)求服務(wù)器回送收到的請(qǐng)求信息,主要用于測(cè)試或診斷CONNECT 保留將來使用OPTIONS 請(qǐng)求查詢服務(wù)器的性能,或者查詢與資源相關(guān)的選項(xiàng)和需求應(yīng)用舉例:GET方法:在瀏覽器的地址欄中輸入網(wǎng)址的

7、方式訪問網(wǎng)頁時(shí),瀏覽器采用GET方法向服務(wù)器獲取資源,eg:GET /form.html HTTP/1.1 (CRLF)POST方法要求被請(qǐng)求服務(wù)器接受附在請(qǐng)求后面的數(shù)據(jù),常用于提交表單。eg:POST /reg.jsp HTTP/ (CRLF)Accept:image/gif,image/x-xbit,. (CRLF).HOST: (CRLF)Content-Length:22 (CRLF)Connection:Keep-Alive (CRLF)Cache-Control:no-cache (CRLF)(CRLF) /該CRLF表示消息報(bào)頭已經(jīng)結(jié)束,在此之前為消息報(bào)頭user=jeffrey

8、&pwd=1234 /此行以下為提交的數(shù)據(jù)HEAD方法與GET方法幾乎是一樣的,對(duì)于HEAD請(qǐng)求的回應(yīng)部分來 說,它的HTTP頭部中包含的信息與通過GET請(qǐng)求所得到的信息是相同的。利用這個(gè)方法,不必傳輸整個(gè)資源內(nèi)容,就可以得到Request-URI所標(biāo)識(shí) 的資源的信息。該方法常用于測(cè)試超鏈接的有效性,是否可以訪問,以及最近是否更新。2、請(qǐng)求報(bào)頭后述3、請(qǐng)求正文(略) HTTP詳解之響應(yīng)篇 在接收和解釋請(qǐng)求消息后,服務(wù)器返回一個(gè)HTTP響應(yīng)消息。HTTP響應(yīng)也是由三個(gè)部分組成,分別是:狀態(tài)行、消息報(bào)頭、響應(yīng)正文1、狀態(tài)行格式如下:HTTP-Version Status-Code Reas

9、on-Phrase CRLF其中,HTTP-Version表示服務(wù)器HTTP協(xié)議的版本;Status-Code表示服務(wù)器發(fā)回的響應(yīng)狀態(tài)代碼;Reason-Phrase表示狀態(tài)代碼的文本描述。狀態(tài)代碼有三位數(shù)字組成,第一個(gè)數(shù)字定義了響應(yīng)的類別,且有五種可能取值:1xx:指示信息-表示請(qǐng)求已接收,繼續(xù)處理2xx:成功-表示請(qǐng)求已被成功接收、理解、接受3xx:重定向-要完成請(qǐng)求必須進(jìn)行更進(jìn)一步的操作4xx:客戶端錯(cuò)誤-請(qǐng)求有語法錯(cuò)誤或請(qǐng)求無法實(shí)現(xiàn)5xx:服務(wù)器端錯(cuò)誤-服務(wù)器未能實(shí)現(xiàn)合法的請(qǐng)求常見狀態(tài)代碼、狀態(tài)描述、說明:200 OK /客戶端請(qǐng)求成功400 Bad Request /客戶端請(qǐng)求有語法

10、錯(cuò)誤,不能被服務(wù)器所理解401 Unauthorized /請(qǐng)求未經(jīng)授權(quán),這個(gè)狀態(tài)代碼必須和WWW-Authenticate報(bào)頭域一起使用 403 Forbidden /服務(wù)器收到請(qǐng)求,但是拒絕提供服務(wù)404 Not Found /請(qǐng)求資源不存在,eg:輸入了錯(cuò)誤的URL500 Internal Server Error /服務(wù)器發(fā)生不可預(yù)期的錯(cuò)誤503 Server Unavailable /服務(wù)器當(dāng)前不能處理客戶端的請(qǐng)求,一段時(shí)間后可能恢復(fù)正常eg:HTTP/1.1 200 OK (CRLF)2、響應(yīng)報(bào)頭后述3、響應(yīng)正文就是服務(wù)器返回的資源的內(nèi)容 HTTP詳解之消息報(bào)頭篇 HTTP消息由客

11、戶端到服務(wù)器的請(qǐng)求和服務(wù)器到客戶端的響應(yīng)組成。請(qǐng)求消息和響應(yīng)消息都是由開始行(對(duì)于請(qǐng)求消息,開始行就是請(qǐng)求行,對(duì)于響應(yīng)消息,開始行就是狀態(tài)行),消息報(bào)頭(可選),空行(只有CRLF的行),消息正文(可選)組成。HTTP消息報(bào)頭包括普通報(bào)頭、請(qǐng)求報(bào)頭、響應(yīng)報(bào)頭、實(shí)體報(bào)頭。每一個(gè)報(bào)頭域都是由名字+“:”+空格+值 組成,消息報(bào)頭域的名字是大小寫無關(guān)的。1、普通報(bào)頭在普通報(bào)頭中,有少數(shù)報(bào)頭域用于所有的請(qǐng)求和響應(yīng)消息,但并不用于被傳輸?shù)膶?shí)體,只用于傳輸?shù)南ⅰg:Cache-Control 用于指定緩存指令,緩存指令是單向的(響應(yīng)中出現(xiàn)的緩存指令在請(qǐng)求中未必會(huì)出現(xiàn)),且是獨(dú)立的(一個(gè)消息的緩存指令不

12、會(huì)影響另一個(gè)消息處理的緩存機(jī)制),HTTP1.0使用的類似的報(bào)頭域?yàn)镻ragma。請(qǐng)求時(shí)的緩存指令包括:no-cache(用于指示請(qǐng)求或響應(yīng)消息不能緩存)、no-store、max-age、max-stale、min-fresh、only-if-cached;響應(yīng)時(shí)的緩存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.eg:為了指示IE瀏覽器(客戶端)不要緩存頁面,服務(wù)器端的JSP程序可以編寫如下:response.sehHeader(&qu

13、ot;Cache-Control","no-cache");/response.setHeader("Pragma","no-cache");作用相當(dāng)于上述代碼,通常兩者/合用這句代碼將在發(fā)送的響應(yīng)消息中設(shè)置普通報(bào)頭域:Cache-Control:no-cacheDate普通報(bào)頭域表示消息產(chǎn)生的日期和時(shí)間Connection普通報(bào)頭域允許發(fā)送指定連接的選項(xiàng)。例如指定連接是連續(xù),或者指定“close”選項(xiàng),通知服務(wù)器,在響應(yīng)完成后,關(guān)閉連接2、請(qǐng)求報(bào)頭請(qǐng)求報(bào)頭舉例:GET /form.html HTTP/1.1 (CRLF)A

14、ccept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)Accept-Language:zh-cn (CRLF)Accept-Encoding:gzip,deflate (CRLF)If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)If-None-Match:W/"80b1a

15、4c018f3c41:8317" (CRLF)User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)Host: (CRLF)Connection:Keep-Alive (CRLF)(CRLF)3、響應(yīng)報(bào)頭響應(yīng)報(bào)頭允許服務(wù)器傳遞不能放在狀態(tài)行中的附加響應(yīng)信息,以及關(guān)于服務(wù)器的信息和對(duì)Request-URI所標(biāo)識(shí)的資源進(jìn)行下一步訪問的信息。常用的響應(yīng)報(bào)頭LocationLocation響應(yīng)報(bào)頭域用于重定向接受者到一個(gè)新的位置。Location響應(yīng)報(bào)頭域常用在更換域名的時(shí)候。ServerServer響應(yīng)報(bào)頭域包含了服

16、務(wù)器用來處理請(qǐng)求的軟件信息。與User-Agent請(qǐng)求報(bào)頭域是相對(duì)應(yīng)的。下面是Server響應(yīng)報(bào)頭域的一個(gè)例子:Server:Apache-Coyote/1.14、實(shí)體報(bào)頭請(qǐng)求和響應(yīng)消息都可以傳送一個(gè)實(shí)體。一個(gè)實(shí)體由實(shí)體報(bào)頭域和實(shí)體正文組成,但并不是說實(shí)體報(bào)頭域和實(shí)體正文要在一起發(fā)送,可以只發(fā)送實(shí)體報(bào)頭域。實(shí)體報(bào)頭定義了關(guān)于實(shí)體正文(eg:有無實(shí)體正文)和請(qǐng)求所標(biāo)識(shí)的資源的元信息。常用的實(shí)體報(bào)頭Content-EncodingContent-Encoding實(shí)體報(bào)頭域被用作媒體類型的修飾符,它的值指示了已經(jīng)被應(yīng)用到實(shí)體正文的附加內(nèi)容的編碼,因而要獲得Content- Type報(bào)頭域中所引用的媒

17、體類型,必須采用相應(yīng)的解碼機(jī)制。Content-Encoding這樣用于記錄文檔的壓縮方法,eg:Content- Encoding:gzipContent-LanguageContent-Language實(shí)體報(bào)頭域描述了資源所用的自然語言。沒有設(shè)置該域則認(rèn)為實(shí)體內(nèi)容將提供給所有的語言閱讀者。eg:Content-Language:daContent-LengthContent-Length實(shí)體報(bào)頭域用于指明實(shí)體正文的長(zhǎng)度,以字節(jié)方式存儲(chǔ)的十進(jìn)制數(shù)字來表示。Content-TypeContent-Type實(shí)體報(bào)頭域用語指明發(fā)送給接收者的實(shí)體正文的媒體類型。eg:Content-Type:tex

18、t/html;charset=ISO-8859-1Content-Type:text/html;charset=GB2312Last-ModifiedLast-Modified實(shí)體報(bào)頭域用于指示資源的最后修改日期和時(shí)間。ExpiresExpires實(shí)體報(bào)頭域給出響應(yīng)過期的日期和時(shí)間。為了讓代理服務(wù)器或?yàn)g覽器在一段時(shí)間以后更新緩存中(再次訪問曾訪問過的頁面時(shí),直接從緩存中加載, 縮短響應(yīng)時(shí)間和降低服務(wù)器負(fù)載)的頁面,我們可以使用Expires實(shí)體報(bào)頭域指定頁面過期的時(shí)間。eg:Expires:Thu,15 Sep 2006 16:23:12 GMTHTTP1.1的客戶端和緩存必須將其他非法的日期

19、格式(包括0)看作已經(jīng)過期。eg:為了讓瀏覽器不要緩存頁面,我們也可以利用Expires實(shí)體報(bào)頭域,設(shè)置為0,jsp中程序如下:response.setDateHeader("Expires","0");利用telnet觀察http協(xié)議的通訊過程 實(shí)驗(yàn)?zāi)康募霸恚?利用MS的telnet工具,通過手動(dòng)輸入http請(qǐng)求信息的方式,向服務(wù)器發(fā)出請(qǐng)求,服務(wù)器接收、解釋和接受請(qǐng)求后,會(huì)返回一個(gè)響應(yīng),該響應(yīng)會(huì)在telnet窗口上顯示出來,從而從感性上加深對(duì)http協(xié)議的通訊過程的認(rèn)識(shí)。 實(shí)驗(yàn)步驟:1、打開telnet1.1 打開telnet運(yùn)行->cmd-&

20、gt;telnet1.2 打開telnet回顯功能set localecho2、連接服務(wù)器并發(fā)送請(qǐng)求2.1 open 80 /注意端口號(hào)不能省略 HEAD /index.asp HTTP/1.0 Host: /*我們可以變換請(qǐng)求方法,請(qǐng)求桂林電子主頁內(nèi)容,輸入消息如下*/ open 80 GET /index.asp HTTP/1.0 /請(qǐng)求資源的內(nèi)容 Host: 2.2 open 80 /在命令提示符號(hào)下直接輸入telnet 80 HEAD /index.asp HTTP/1.0 Host:3 實(shí)驗(yàn)結(jié)果:3.1 請(qǐng)求信息2.1得到的響應(yīng)是:HTTP/1.1 200 OK /請(qǐng)求成功Serve

21、r: Microsoft-IIS/5.0 /web服務(wù)器Date: Thu,08 Mar 200707:17:51 GMTConnection: Keep-Alive Content-Length: 23330Content-Type: text/htmlExpries: Thu,08 Mar 2007 07:16:51 GMTSet-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/Cache-control: private/資源內(nèi)容省略3.2 請(qǐng)求信息2.2得到的響應(yīng)是:HTTP/1.0 404 Not Found

22、/請(qǐng)求失敗Date: Thu, 08 Mar 2007 07:50:50 GMTServer: Apache/2.0.54 <Unix>Last-Modified: Thu, 30 Nov 2006 11:35:41 GMTETag: "6277a-415-e7c76980"Accept-Ranges: bytesX-Powered-By: mod_xlayout_jh/0.0.1vhs.markII.remixVary: Accept-EncodingContent-Type: text/htmlX-Cache: MISS from zjm152-Via: 1

23、.0 zjm152-:80<squid/2.6.STABLES-20061207>X-Cache: MISS from th-Connection: closeHttpClient核心類描述 * <pre> * 主要類: * 客戶端 * HttpClient, * 請(qǐng)求(post|get) * HttpPost(HttpGet), * 請(qǐng)求數(shù)據(jù) * HttpEntity * 簡(jiǎn)單的表單數(shù)據(jù) * UrlEncodedFormEntity <-List<NameValuePair> * 帶文件的數(shù)據(jù) * MultipartEntity增加FileBody,

24、StringBody * 請(qǐng)求設(shè)置請(qǐng)求數(shù)據(jù) * HttpPost(HttpGet).setEntity(HttpEntity entity); * 客戶端執(zhí)行請(qǐng)求 * HttpResponse resp = HttpClient.execute(HttpPost|HttpGet) * 響應(yīng) * HttpResponse * 響應(yīng)數(shù)據(jù) * HttpResponse.getEntity(); * 中文亂碼 * 請(qǐng)求數(shù)據(jù)的編碼: * UrlEncodedFormEntity reqEntity = new UrlEncodedFormEntity * (formparams,"UTF-8&

25、quot;); * Charset utf8 = Charset.forName("UTF-8"); * StringBody sb = new StringBody("簡(jiǎn)單表單數(shù)據(jù)值1", utf8); * 響應(yīng)數(shù)據(jù)的編碼: * String respString = EntityUtils.toString(resEntity, "UTF-8"); *使用連接池 *編寫連接池類 *HttpClientPool, *客戶端使用的時(shí)候代碼: *HttpClient httpclient = HttpClientPool. *getIn

26、stance().getHttpClient(); *保持會(huì)話 *比如tomcat的session使用cookie實(shí)現(xiàn) *首先,客戶端項(xiàng)服務(wù)器發(fā)送登錄請(qǐng)求, *登錄成功,服務(wù)端向客戶端寫一個(gè)cookie,里面存放jsessionid *以后,客戶端每次請(qǐng)求服務(wù)端的時(shí)候, *在請(qǐng)求的消息頭中將jsessionid放在cookie中帶過去, */定義存放sessionid的threadlocal *private ThreadLocal<String> jsessionid=new ThreadLocal<String>(); */登錄,得到響應(yīng)的頭信息中的cookie(j

27、sessionid) *Header h = response.getFirstHeader("Set-Cookie"); *if(h!=null) *System.out.println("h->"+h.getName()+":"+h.getValue(); *String cookie = h.getValue(); */放在threadlocal中,供后面的邏輯代碼使用 *jsessionid.set(cookie.substring(0,cookie.indexOf(""); * */登錄以后, *S

28、tring cookie = jsessionid.get();/拿到threadlocal中的cookie值 *httppost.setHeader("cookie", cookie);/設(shè)置請(qǐng)求頭中的cookie * * </pre>版本3.x和4.x有很大區(qū)別4.1需要的jar包httpclient-4.1.jarhttpclient-cache-4.1.jarhttpcore-4.1.jarhttpmime-4.1.jar (上傳文件需要)發(fā)送請(qǐng)求/ 測(cè)試發(fā)送請(qǐng)求Testpublic void login() String url = "htt

29、p:/localhost:8080" + "/course-ssh2-anno-demo"+ "/httpClient/login.action"/ 得到客戶端HttpClientHttpClient httpclient = new DefaultHttpClient();/ 得到請(qǐng)求HttpPostHttpPost httppost = new HttpPost(url);try / 定義表單數(shù)據(jù)List<NameValuePair> formparams = new ArrayList<NameValuePair>

30、();formparams.add(new BasicNameValuePair("username", "aaa");formparams.add(new BasicNameValuePair("password", "aaa");/ 定義請(qǐng)求數(shù)據(jù)UrlEncodedFormEntity uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");/ 請(qǐng)求設(shè)置請(qǐng)求數(shù)據(jù)httppost.setEntity(uefEntity);System

31、.out.println("executing request " + httppost.getURI();/ 客戶端執(zhí)行請(qǐng)求,得到響應(yīng)HttpResponseHttpResponse response = httpclient.execute(httppost);/ 得到響應(yīng)的消息體(響應(yīng)數(shù)據(jù))HttpEntity entity = response.getEntity();if (entity != null) System.out.println("-");System.out.println("Response content: &qu

32、ot;+ EntityUtils.toString(entity, "UTF-8");System.out.println("-"); catch (Exception e) e.printStackTrace(); finally / 關(guān)閉連接,釋放資源httpclient.getConnectionManager().shutdown();發(fā)送附件/ 測(cè)試上傳文件Testpublic void uploadFile() HttpClient httpclient = null;try /定義客戶端httpclient = new DefaultHtt

33、pClient();/定義請(qǐng)求HttpPost httppost = new HttpPost("http:/localhost:8080"+ "/course-ssh2-anno-demo"+ "/httpClient/uploadFile.action");/定義Multipart類型的消息體(請(qǐng)求數(shù)據(jù))MultipartEntity reqEntity = new MultipartEntity();String path = getExcelPath("member.xlsx");/定義文件數(shù)據(jù)FileBo

34、dy bin = new FileBody(new File(path);/Multipart類型的消息體添加文件數(shù)據(jù)reqEntity.addPart("upload", bin);/ upload為請(qǐng)求后臺(tái)的File upload屬性/Multipart類型的消息體添加普通表單域數(shù)據(jù)/ 設(shè)置傳輸?shù)膮?shù)編碼為UTF-8,解決中文亂碼問題Charset utf8 = Charset.forName("UTF-8");reqEntity.addPart("param1", new StringBody("簡(jiǎn)單表單數(shù)據(jù)值1&qu

35、ot;, utf8);reqEntity.addPart("param2", new StringBody("簡(jiǎn)單表單數(shù)據(jù)值2", utf8);/請(qǐng)求設(shè)置消息體(請(qǐng)求數(shù)據(jù))httppost.setEntity(reqEntity);/客戶端執(zhí)行請(qǐng)求,得到響應(yīng)HttpResponse response = httpclient.execute(httppost);int statusCode = response.getStatusLine().getStatusCode();if (statusCode = org.apache.http.HttpSta

36、tus.SC_OK) HttpEntity resEntity = response.getEntity();/ httpclient自帶的工具類讀取返回?cái)?shù)據(jù)/ 設(shè)置編碼為UTF-8,解決中文亂碼問題String respString = EntityUtils.toString(resEntity, "UTF-8");System.out.println(respString);EntityUtils.consume(resEntity); catch (Exception e) e.printStackTrace(); finally try httpclient.ge

37、tConnectionManager().shutdown();/釋放連接 catch (Exception ignore) httpclient連接池定義連接池public class HttpClientPool private HttpParams httpParams;private ClientConnectionManager connectionManager;private static HttpClientPool inst = new HttpClientPool();/* * 最大連接數(shù) */public final static int MAX_TOTAL_CONNEC

38、TIONS = 100;/* * 獲取連接的最大等待時(shí)間 */public final static int WAIT_TIMEOUT = 60 * 1000;/* * 每個(gè)路由最大連接數(shù) */public final static int MAX_ROUTE_CONNECTIONS = MAX_TOTAL_CONNECTIONS/2;/* * 連接超時(shí)時(shí)間 */public final static int CONNECT_TIMEOUT = 30 * 1000;/* * 讀取超時(shí)時(shí)間 */public final static int READ_TIMEOUT = 30 * 1000;pu

39、blic static HttpClientPool getInstance() return inst;private HttpClientPool() this.httpParams = new BasicHttpParams();/ 設(shè)置最大連接數(shù)ConnManagerParams.setMaxTotalConnections(httpParams,MAX_TOTAL_CONNECTIONS);/ 設(shè)置獲取連接的最大等待時(shí)間ConnManagerParams.setTimeout(httpParams, WAIT_TIMEOUT);/ 設(shè)置每個(gè)路由最大連接數(shù)ConnPerRouteBea

40、n connPerRoute = new ConnPerRouteBean(MAX_ROUTE_CONNECTIONS);ConnManagerParams.setMaxConnectionsPerRoute(httpParams, connPerRoute);/ 設(shè)置連接超時(shí)時(shí)間HttpConnectionParams.setConnectionTimeout(httpParams, CONNECT_TIMEOUT);/ 設(shè)置讀取超時(shí)時(shí)間HttpConnectionParams.setSoTimeout(httpParams, READ_TIMEOUT);SchemeRegistry reg

41、istry = new SchemeRegistry();registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 8080);/registry.register(new Scheme("http", PlainSocketFactory/.getSocketFactory(), 8080);registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(),

42、443);this.connectionManager = new ThreadSafeClientConnManager(httpParams,registry);/* * 從連接池得到連接 * return */public HttpClient getHttpClient() return new DefaultHttpClient(this.connectionManager, this.httpParams);private HttpClientPool(HttpParams httpParams,ClientConnectionManager connectionManager)

43、super();this.httpParams = httpParams;this.connectionManager = connectionManager;使用連接池HttpClient httpclient = HttpClientPool.getInstance().getHttpClient();模擬瀏覽器模式httpclient.getParams().setParameter(ClientPNames.COOKIE_POLICY,CookiePolicy.BROWSER_COMPATIBILITY);保持會(huì)話Testpublic void keepSession() / 首先登錄

44、String url = "http:/localhost:8080" + "/course-ssh2-anno-demo"+ "/httpClient/login.action"String cookieJsessionId = sendLoginRequest(url);/ 然后訪問(需要登錄之后才能訪問的)資源sendRequestAfterLogin(cookieJsessionId);/ 發(fā)送登錄的請(qǐng)求private String sendLoginRequest(String url) String cookieJsess

45、ionId = null;HttpClient httpclient = HttpClientPool.getInstance().getHttpClient();HttpPost httppost = new HttpPost(url);List<NameValuePair> formparams = new ArrayList<NameValuePair>();formparams.add(new BasicNameValuePair("username", "aaa");formparams.add(new BasicNam

46、eValuePair("password", "aaa");UrlEncodedFormEntity uefEntity;try uefEntity = new UrlEncodedFormEntity(formparams, "UTF-8");httppost.setEntity(uefEntity);System.out.println("executing request " + httppost.getURI();HttpResponse response;response = httpclient.exe

47、cute(httppost);/ 得到響應(yīng)的頭信息中的cookie(jsessionid)Header h = response.getFirstHeader("Set-Cookie");if (h != null) System.out.println("h->" + h.getName() + ":" + h.getValue();String cookie = h.getValue();if (cookie.indexOf("") > 0) cookieJsessionId = cookie.su

48、bstring(0, cookie.indexOf(""); else cookieJsessionId = cookie;Header headers = response.getAllHeaders();for (int i = 0; i < headers.length; i+) Header header = headersi;if (header != null)System.out.println("header:" + header.getName() + ":"+ header.getValue();HttpEn

49、tity entity = response.getEntity();if (entity != null) System.out.println("-");System.out.println("Response content: "+ EntityUtils.toString(entity, "UTF-8");System.out.println("-"); catch (Exception e) e.printStackTrace();return cookieJsessionId;/ 發(fā)送(需要登錄之后才能

50、訪問的)請(qǐng)求private void sendRequestAfterLogin(String cookie) HttpClient httpclient = HttpClientPool.getInstance().getHttpClient();String url = "http:/localhost:8080" + "/course-ssh2-anno-demo"+ "/httpClient/actionAfterLogin.action"HttpPost httppost = new HttpPost(url);httppo

51、st.setHeader("cookie", cookie);/ 設(shè)置請(qǐng)求頭中的cookietry System.out.println("executing request " + httppost.getURI();HttpResponse response;response = httpclient.execute(httppost);HttpEntity entity = response.getEntity();if (entity != null) System.out.println("-");System.out.pr

52、intln("Response content: "+ EntityUtils.toString(entity, "UTF-8");System.out.println("-"); catch (Exception e) e.printStackTrace();使用httpClient抓取網(wǎng)頁內(nèi)容實(shí)例案例:查詢身份證號(hào)信息項(xiàng)目中需要提供查詢身份證號(hào)信息的功能,可以抓取其他網(wǎng)站的內(nèi)容1. 搜索找到提供這些服務(wù)的網(wǎng)站2. 得到如下頁面3. 打開firebug,查看頁面元素頁面中傳遞的參數(shù)名稱是in_id<input class=”i

53、n” type=”text” value=” maxlength=”120” name=”in_id”>4. Firebug中打開“網(wǎng)絡(luò)”選項(xiàng)卡,點(diǎn)擊”清除”,清除一些日志,在頁面輸入身份證進(jìn)行查詢5. 在上圖中,可以看到是POST index.php發(fā)送的查詢請(qǐng)求,點(diǎn)擊”POST”查看POST請(qǐng)求的具體的參數(shù)信息Url是參數(shù)submit是按鈕<input class="but" type="submit" value="查 詢" name="submit">

54、;傳遞的 再來看看,查詢結(jié)果頁面上的html代碼的結(jié)構(gòu),<div class="d">四川省達(dá)州市通州區(qū)</div><div class="d">1977年01月19日</div><div class="d">男</div><div class="d">lt;/div> 可以使用正則表達(dá)式String regex="<div class="d">S0,100</div>"匹配 6. 編寫httpclient 代碼發(fā)送請(qǐng)求Testpu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論