Java Socket应答与HTTP服务器的瓜葛

Java Socket应答与HTTP服务器的瓜葛

Java Socket应答一直伴随着我们的编程生活,在不断的发展中有很多知识需要我们学习。下面我们就先来看看有关JavaSocket应答的代码,有点长,但是看下去就会让你豁然开朗。

HTTP/1.1表示这个HTTP服务器是1.1版,200是服务器对客户请求的应答状态码,OK是对应答状态码的解释,之后是这个文档的元信息和文档正文。(相关应答状态码和元信息的解释请参阅Inetrnet标准草案:RFC2616)。

 
 
  1. Http.java
  2. importjava.net.*;
  3. importjava.io.*;
  4. importjava.util.Properties;
  5. importjava.util.Enumeration;
  6. publicclassHttp{
  7. protectedSocketclient;
  8. protectedBufferedOutputStreamsender;
  9. protectedBufferedInputStreamreceiver;
  10. protectedByteArrayInputStreambyteStream;
  11. protectedURLtarget;
  12. privateintresponseCode=-1;
  13. privateStringresponseMessage="";
  14. privateStringserverVersion="";
  15. privatePropertiesheader=newProperties();
  16. publicHttp(){}
  17. publicHttp(Stringurl){
  18. GET(url);
  19. }
  20. /*GET方法根据URL,会请求文件、数据库查询结果、程序运行结果等多种内容*/
  21. publicvoidGET(Stringurl){
  22. try{
  23. checkHTTP(url);
  24. openServer(target.getHost(),target.getPort());
  25. Stringcmd="GET"+getURLFormat(target)+"HTTP/1.0\r\n"
  26. +getBaseHeads()+"\r\n";
  27. sendMessage(cmd);
  28. receiveMessage();
  29. }catch(ProtocolExceptionp){
  30. p.printStackTrace();
  31. return;
  32. }catch(UnknownHostExceptione){
  33. e.printStackTrace();
  34. return;
  35. }catch(IOExceptioni){
  36. i.printStackTrace();
  37. return;
  38. }
  39. }
  40. /*
  41. *HEAD方法只请求URL的元信息,不包括URL本身。若怀疑本机和服务器上的
  42. *文件相同,用这个方法检查最快捷有效。
  43. */
  44. publicvoidHEAD(Stringurl){
  45. try{
  46. checkHTTP(url);
  47. openServer(target.getHost(),target.getPort());
  48. Stringcmd="HEAD"+getURLFormat(target)+"HTTP/1.0\r\n"
  49. +getBaseHeads()+"\r\n";
  50. sendMessage(cmd);
  51. receiveMessage();
  52. }catch(ProtocolExceptionp){
  53. p.printStackTrace();
  54. return;
  55. }catch(UnknownHostExceptione){
  56. e.printStackTrace();
  57. return;
  58. }catch(IOExceptioni){
  59. i.printStackTrace();
  60. return;
  61. }
  62. }
  63. /*
  64. *POST方法是向服务器传送数据,以便服务器做出相应的处理。例如网页上常用的
  65. *提交表格。
  66. */
  67. publicvoidPOST(Stringurl,Stringcontent){
  68. try{
  69. checkHTTP(url);
  70. openServer(target.getHost(),target.getPort());
  71. Stringcmd="POST"+getURLFormat(target)+"HTTP/1.0\r\n"+getBaseHeads();
  72. cmd+="Content-type:application/x-www-form-urlencoded\r\n";
  73. cmd+="Content-length:"+content.length()+"\r\n\r\n";
  74. cmd+=content+"\r\n";
  75. sendMessage(cmd);
  76. receiveMessage();
  77. }catch(ProtocolExceptionp){
  78. p.printStackTrace();
  79. return;
  80. }catch(UnknownHostExceptione){
  81. e.printStackTrace();
  82. return;
  83. }catch(IOExceptioni){
  84. i.printStackTrace();
  85. return;
  86. }
  87. }
  88. protectedvoidcheckHTTP(Stringurl)throwsProtocolException{
  89. try{
  90. URLtarget=newURL(url);
  91. if(target==null||!target.getProtocol().toUpperCase().equals("HTTP"))
  92. thrownewProtocolException("这不是HTTP协议");
  93. this.target=target;
  94. }catch(MalformedURLExceptionm){
  95. thrownewProtocolException("协议格式错误");
  96. }
  97. }
  98. /*
  99. *与Web服务器连接。若找不到Web服务器,InetAddress会引发UnknownHostException
  100. *异常。若Socket连接失败,会引发IOException异常。
  101. */
  102. protectedvoidopenServer(Stringhost,intport)throws
  103. UnknownHostException,IOException{
  104. header.clear();
  105. responseMessage="";responseCode=-1;
  106. try{
  107. if(client!=null)closeServer();
  108. if(byteStream!=null){
  109. byteStream.close();byteStream=null;
  110. }
  111. InetAddressaddress=InetAddress.getByName(host);
  112. client=newSocket(address,port==-1?80:port);
  113. sender=newBufferedOutputStream(client.getOutputStream());
  114. receiver=newBufferedInputStream(client.getInputStream());
  115. }catch(UnknownHostExceptionu){
  116. throwu;
  117. }catch(IOExceptioni){
  118. throwi;
  119. }
  120. }
  121. /*关闭与Web服务器的连接*/
  122. protectedvoidcloseServer()throwsIOException{
  123. if(client==null)return;
  124. try{
  125. client.close();sender.close();receiver.close();
  126. }catch(IOExceptioni){
  127. throwi;
  128. }
  129. client=null;sender=null;receiver=null;
  130. }
  131. protectedStringgetURLFormat(URLtarget){
  132. Stringspec="http://
  133. +target.getHost();
  134. if(target.getPort()!=-1)
  135. spec+=":"+target.getPort();
  136. returnspec+=target.getFile();
  137. }
  138. /*向Web服务器传送数据*/
  139. protectedvoidsendMessage(Stringdata)throwsIOException{
  140. sender.write(data.getBytes(),0,data.length());
  141. sender.flush();
  142. }
  143. /*接收来自Web服务器的数据*/
  144. protectedvoidreceiveMessage()throwsIOException{
  145. bytedata[]=newbyte[1024];
  146. intcount=0;
  147. intword=-1;
  148. //解析第一行
  149. while((word=receiver.read())!=-1){
  150. if(word=='\r'||word=='\n'){
  151. word=receiver.read();
  152. if(word=='\n')word=receiver.read();
  153. break;
  154. }
  155. if(count==data.length)data=addCapacity(data);
  156. data[count++]=(byte)word;
  157. }
  158. Stringmessage=newString(data,0,count);
  159. intmark=message.indexOf(32);
  160. serverVersion=message.substring(0,mark);
  161. while(mark<message.length()&&message.charAt(mark+1)==32)mark++;
  162. responseCode=Integer.parseInt(message.substring(mark+1,mark+=4));
  163. responseMessage=message.substring(mark,message.length()).trim();
  164. //应答状态码和处理请读者添加
  165. switch(responseCode){
  166. case400:
  167. thrownewIOException("错误请求");
  168. case404:
  169. thrownewFileNotFoundException(getURLFormat(target));
  170. case503:
  171. thrownewIOException("服务器不可用");
  172. }
  173. if(word==-1)thrownewProtocolException("信息接收异常终止");
  174. intsymbol=-1;
  175. count=0;
  176. //解析元信息
  177. while(word!='\r'&&word!='\n'&&word>-1){
  178. if(word=='\t')word=32;
  179. if(count==data.length)data=addCapacity(data);
  180. data[count++]=(byte)word;
  181. parseLine:{
  182. while((symbol=receiver.read())>-1){
  183. switch(symbol){
  184. case'\t':
  185. symbol=32;break;
  186. case'\r':
  187. case'\n':
  188. word=receiver.read();
  189. if(symbol=='\r'&&word=='\n'){
  190. word=receiver.read();
  191. if(word=='\r')word=receiver.read();
  192. }
  193. if(word=='\r'||word=='\n'||word>32)breakparseLine;
  194. symbol=32;break;
  195. }
  196. if(count==data.length)data=addCapacity(data);
  197. data[count++]=(byte)symbol;
  198. }
  199. word=-1;
  200. }
  201. message=newString(data,0,count);
  202. mark=message.indexOf(':');
  203. Stringkey=null;
  204. if(mark>0)key=message.substring(0,mark);
  205. mark++;
  206. while(mark<message.length()&&message.charAt(mark)<=32)mark++;
  207. Stringvalue=message.substring(mark,message.length());
  208. header.put(key,value);
  209. count=0;
  210. }
  211. //获得正文数据
  212. while((word=receiver.read())!=-1){
  213. if(count==data.length)data=addCapacity(data);
  214. data[count++]=(byte)word;
  215. }
  216. if(count>0)byteStream=newByteArrayInputStream(data,0,count);
  217. data=null;
  218. closeServer();
  219. }
  220. publicStringgetResponseMessage(){
  221. returnresponseMessage;
  222. }
  223. publicintgetResponseCode(){
  224. returnresponseCode;
  225. }
  226. publicStringgetServerVersion(){
  227. returnserverVersion;
  228. }
  229. publicInputStreamgetInputStream(){
  230. returnbyteStream;
  231. }
  232. publicsynchronizedStringgetHeaderKey(inti){
  233. if(i>=header.size())returnnull;
  234. Enumerationenum=header.propertyNames();
  235. Stringkey=null;
  236. for(intj=0;j<=i;j++)
  237. key=(String)enum.nextElement();
  238. returnkey;
  239. }
  240. publicsynchronizedStringgetHeaderValue(inti){
  241. if(i>=header.size())returnnull;
  242. returnheader.getProperty(getHeaderKey(i));
  243. }
  244. publicsynchronizedStringgetHeaderValue(Stringkey){
  245. returnheader.getProperty(key);
  246. }
  247. protectedStringgetBaseHeads(){
  248. Stringinf="User-Agent:myselfHttp/1.0\r\n"+
  249. "Accept:www/source;text/html;image/gif;*/*\r\n";
  250. returninf;
  251. }
  252. privatebyte[]addCapacity(byterece[]){
  253. bytetemp[]=newbyte[rece.length+1024];
  254. System.arraycopy(rece,0,temp,0,rece.length);
  255. returntemp;
  256. }
  257. publicstaticvoidmain(String[]args){
  258. Httphttp=newHttp();
  259. //http.GET("http://192.168.1.5
  260. );
  261. inti;
  262. for(i=0;i<50000;i++){
  263. http.GET("http://www.model-dl.com/modelinfo.asp?modelid=101);
  264. http.POST("http://www.model-dl.com/modelinfo.asp?modelid=101,"ratecontd=101&MM_insert=form1");
  265. }
  266. }
  267. }

以上就是对Java Socket应答的相关介绍,希望大家有所发现。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值