自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HTTP協(xié)議包讀取過(guò)程的Java實(shí)現(xiàn)

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
首先我們?cè)诹私饬饲拔牡幕A(chǔ)后,再來(lái)對(duì)讀取HTTP協(xié)議包的代碼進(jìn)行一下講解。那么這部分內(nèi)容的代碼比較多,希望能夠幫助大家了解這部分內(nèi)容。

之前的兩篇文章中《GET實(shí)現(xiàn)HTTP協(xié)議請(qǐng)求包的分析》和《HTTP協(xié)議請(qǐng)求包的Java實(shí)現(xiàn)》對(duì)HTTP協(xié)議包的請(qǐng)求連接內(nèi)容進(jìn)行了不少的講解。那么本文將繼續(xù)做一下補(bǔ)充,主要是講解如何完成讀取HTTP包。

以下我自己設(shè)計(jì)的一個(gè)讀取HTTP協(xié)議包的類(lèi)SocketRequest。

  1. public class SocketRequest   
  2. {//從指定的Socket的InputStream中讀取數(shù)據(jù)  
  3. private InputStreaminput;  
  4. private Stringuri;  
  5. private StringBufferrequest=new StringBuffer();//用于保存所有內(nèi)容  
  6. private intCONTENT_LENGTH=0;//實(shí)際包內(nèi)容數(shù)據(jù)長(zhǎng)  
  7. private boolean bePost = false;  
  8. private boolean beHttpResponse = false;  
  9. private boolean beChucked = false;  
  10. private boolean beGet = false;  
  11. private bytecrlf13 = (byte)13; //'r'  
  12. private bytecrlf10 = (byte)10;//'n'  
  13. public SocketRequest(InputStream input) {  
  14. this.input = input;}  
  15. public SocketRequest(Socket socket) {  
  16. this.input = socket.getInputStream();}  
  17. public void ReadData()   
  18. {//解析 獲得InputStream的數(shù)據(jù)   
  19. ReadHeader();//頭部  
  20. if(beChucked) //為Chucked  
  21. {int ChuckSize=0;  
  22. while((ChuckSize=getChuckSize())>0) //多個(gè)Chucked  
  23. {readLenData(ChuckSize+2);//讀取定長(zhǎng)數(shù)據(jù)}  
  24. readLenData(2); //最后的2位}  
  25. if(CONTENT_LENGTH>0)  
  26. {readLenData(CONTENT_LENGTH);//讀取定長(zhǎng)數(shù)據(jù)}  
  27. uri = "";//parseUri(new String(request));}  
  28. private void readLenData(int size)//讀取定長(zhǎng)數(shù)據(jù)  
  29. {int readed=0;//已經(jīng)讀取數(shù)  
  30. try{  
  31. int available=0;//input.available(); //可讀數(shù)  
  32. if(available>(size-readed)) available=size-readed;  
  33. while( readed<size )  
  34. {while(available==0){//等到有數(shù)據(jù)可讀  
  35. available = input.available(); //可讀數(shù)}  
  36. if(available>(size-readed)) available= size-readed; //size-readed--剩余數(shù)  
  37. if(available>2048) available= 2048; //size-readed--剩余數(shù)  
  38. byte[] buffer = new byte[available];  
  39. int reading = input.read(buffer);  
  40. request=request.append(new String(buffer,0,reading));//byte數(shù)組相加  
  41. readed+=reading;//已讀字符  
  42. }}catch(IOException e){System.out.println("Read readLenData Error!");} }   
  43. private voidReadHeader() //讀取頭部 并獲得大小  
  44. {byte[]crlf= new byte[1];  
  45. intcrlfNum= 0;//已經(jīng)連接的回車(chē)換行數(shù) crlfNum=4為頭部結(jié)束  
  46. try{while( input.read(crlf)!=-1 )//讀取頭部  
  47. {if(crlf[0]==crlf13 || crlf[0]==crlf10)  
  48. {crlfNum++; }  
  49. else 
  50. {crlfNum=0;} //不是則清  
  51. request=request.append(new String(crlf,0,1));//byte數(shù)組相加  
  52. if(crlfNum==4) break;}}  
  53. catch(IOException e){System.out.println("Read Http Header Error!");  
  54. return;}  
  55. String tempStr=(new String(request)).toUpperCase();//這里我只處理了GET與POST方法  
  56. StringstrMethod= tempStr.substring(0,4);  
  57. if(strMethod.equals("GET ")) //前  
  58. {beGet=true;}  
  59. else if(strMethod.equals("POST"))  
  60. {bePost=true;  
  61. getContentlen_Chucked(tempStr);}  
  62. else {System.out.println("不支持的HTTP協(xié)議包類(lèi)型");}//其它的其它類(lèi)型 暫不支持  
  63. }  
  64. private void getContentlen_Chucked(String tempStr)//獲得長(zhǎng)度 CONTENT-LENGTH 或 是否為CHUNKED型  
  65. {String ss1="CONTENT-LENGTH:";  
  66. String ss2=new String("TRANSFER-ENCODING: CHUNKED");  
  67. int clIndex= tempStr.indexOf(ss1);  
  68. int chuckIndex = tempStr.indexOf(ss2);//為CHUNKED型  
  69. byte requst[]= tempStr.getBytes();  
  70. if(clIndex!=-1)  
  71. //從clIndex+1起至rn  
  72. StringBuffer sb=new StringBuffer();  
  73. for(int i=(clIndex+16);;i++)  
  74. {if(requst[i]!=(byte)13 && requst[i]!=(byte)10 )  
  75. {sb.append((char)requst[i]);}  
  76. else   
  77. break;}  
  78. CONTENT_LENGTH=Integer.parseInt(sb.toString());//正式的HTML文件的大小  
  79. //System.out.println("CONTENT_LENGTH=="+CONTENT_LENGTH);}  
  80. if(chuckIndex!=-1) beChucked=true;}  
  81. private intgetChuckSize() //Chuck大小{  
  82. byte[]crlf= new byte[1];  
  83. StringBuffersb1= new StringBuffer();  
  84. intcrlfNum= 0;//已經(jīng)連接的回車(chē)換行數(shù) crlfNum=4為頭部結(jié)束  
  85. try{while(input.read(crlf)!=-1)//讀取頭部{  
  86. if(crlf[0]==crlf13 || crlf[0]==crlf10)  
  87. {crlfNum++; }  
  88. else 
  89. {crlfNum=0;} //不是則清  
  90. sb1.append((char)crlf[0]);  
  91. request=request.append(new String(crlf,0,1));//byte數(shù)組相加  
  92. if(crlfNum==2) break;}  
  93. }catch(IOException e){  
  94. System.out.println("Read Http Package Error!");  
  95. return 0;}  
  96. return Integer.parseInt((sb1.toString()).trim(),16); //16進(jìn)控制  
  97. }//通過(guò)此來(lái)進(jìn)行過(guò)濾,是否為發(fā)至目標(biāo)服務(wù)器的HTTP協(xié)議包  
  98. private String parseUri(String requestString) {   
  99. int index1, index2;  
  100. index1 = requestString.indexOf(' ');  
  101. if (index1 != -1) {  
  102. index2 = requestString.indexOf(' ', index1 + 1);  
  103. if (index2 > index1)  
  104. return requestString.substring(index1 + 1, index2);}  
  105. return null;}  
  106. public String getData() {  
  107. return request.toString();}} 

使用此類(lèi):

  1. SocketRequest request = new SocketRequest(socket); //socket為ServerSocket.accept()返回的Socket實(shí)例  
  2. request.ReadData();//讀取數(shù)據(jù)  
  3. request.getData(); 

為什么我要用這么大的力量去讀取呢,尤其是在因?yàn)镾ocket連接在發(fā)送數(shù)據(jù)時(shí),由于網(wǎng)絡(luò)的原因經(jīng)常會(huì)發(fā)生延遲現(xiàn)象,可能在服務(wù)器端開(kāi)始接收數(shù)據(jù)時(shí)可能只有部分?jǐn)?shù)據(jù)可以從InputStream中獲得,在一些地方處理不當(dāng)時(shí),可能只能獲得不完整的數(shù)據(jù)或是錯(cuò)誤的數(shù)據(jù)。

從InputStream讀取字節(jié)時(shí)有多種辦法:

常用int read()與int read(byte[] b)。在用read(byte[])時(shí),程序員經(jīng)常會(huì)犯錯(cuò)誤,因?yàn)樵诰W(wǎng)絡(luò)環(huán)境中,讀取的數(shù)據(jù)量不一定等于參數(shù)的大小。

責(zé)任編輯:佟健 來(lái)源: 網(wǎng)界網(wǎng)
相關(guān)推薦

2010-06-29 13:24:26

HTTP協(xié)議

2010-06-29 13:18:31

HTTP協(xié)議

2020-06-17 21:39:11

HTTP協(xié)議服務(wù)器

2019-04-08 15:11:12

HTTP協(xié)議Web

2010-06-24 13:18:38

ICMP協(xié)議

2018-04-17 16:29:24

Java面試HTTP

2019-08-01 15:25:17

Http服務(wù)器協(xié)議

2014-10-22 09:36:41

TCPIP

2021-03-05 11:20:24

HTTPWebshellWeb服務(wù)器

2015-10-09 15:07:02

HTTP網(wǎng)絡(luò)協(xié)議

2017-05-26 10:35:13

前端HTTP

2018-10-18 10:05:43

HTTP網(wǎng)絡(luò)協(xié)議TCP

2015-09-15 13:48:01

網(wǎng)絡(luò)協(xié)議HTTP Client

2010-07-01 16:01:05

HTTP協(xié)議

2010-06-08 12:31:15

HTTP協(xié)議實(shí)體

2010-09-09 13:09:33

協(xié)議棧開(kāi)發(fā)

2010-06-23 14:27:04

Fix協(xié)議

2011-09-06 09:48:41

MTK平臺(tái)

2022-03-09 18:54:30

HTTP緩存協(xié)議cache

2019-08-23 06:36:32

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)