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

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

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

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

  
  
  1. Http.java   
  2. import java.net.*;   
  3. import java.io.*;   
  4. import java.util.Properties;   
  5. import java.util.Enumeration;   
  6. public class Http {   
  7. protected Socket client;   
  8. protected BufferedOutputStream sender;   
  9. protected BufferedInputStream receiver;   
  10. protected ByteArrayInputStream byteStream;   
  11. protected URL target;   
  12. private int responseCode=-1;   
  13. private String responseMessage="";   
  14. private String serverVersion="";   
  15. private Properties header = new Properties();   
  16. public Http() { }   
  17. public Http(String url) {   
  18. GET(url) ;   
  19. }   
  20. /* GET方法根据URL,会请求文件、数据库查询结果、程序运行结果等多种内容 */   
  21. public void GET(String url) {   
  22. try {   
  23. checkHTTP(url);   
  24. openServer(target.getHost(),target.getPort() );   
  25. String cmd = "GET "+ getURLFormat(target) +" HTTP/1.0\r\n"   
  26. + getBaseHeads()+"\r\n";   
  27. sendMessage(cmd);   
  28. receiveMessage();   
  29. } catch(ProtocolException p) {   
  30. p.printStackTrace();   
  31. return;   
  32. } catch(UnknownHostException e) {   
  33. e.printStackTrace();   
  34. return;   
  35. } catch(IOException i) {   
  36. i.printStackTrace();   
  37. return;   
  38. }   
  39. }   
  40. /*   
  41. * HEAD方法只请求URL的元信息,不包括URL本身。若怀疑本机和服务器上的   
  42. * 文件相同,用这个方法检查最快捷有效。   
  43. */   
  44. public void HEAD(String url) {   
  45. try {   
  46. checkHTTP(url);   
  47. openServer(target.getHost(),target.getPort() );   
  48. String cmd = "HEAD "+getURLFormat(target)+" HTTP/1.0\r\n"   
  49. +getBaseHeads()+"\r\n";   
  50. sendMessage(cmd);   
  51. receiveMessage();   
  52. }catch(ProtocolException p) {   
  53. p.printStackTrace();   
  54. return;   
  55. }catch(UnknownHostException e) {   
  56. e.printStackTrace();   
  57. return;   
  58. }catch(IOException i) {   
  59. i.printStackTrace();   
  60. return;   
  61. }   
  62. }   
  63. /*   
  64. * POST方法是向服务器传送数据,以便服务器做出相应的处理。例如网页上常用的   
  65. * 提交表格。   
  66. */   
  67. public void POST(String url,String content) {   
  68. try {   
  69. checkHTTP(url);   
  70. openServer(target.getHost(),target.getPort() );   
  71. String cmd = "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(ProtocolException p) {   
  78. p.printStackTrace();   
  79. return;   
  80. }catch(UnknownHostException e) {   
  81. e.printStackTrace();   
  82. return;   
  83. }catch(IOException i) {   
  84. i.printStackTrace();   
  85. return;   
  86. }   
  87. }   
  88. protected void checkHTTP(String url) throws ProtocolException {   
  89. try {   
  90. URL target = new URL(url);   
  91. if(target==null || !target.getProtocol().toUpperCase().equals("HTTP") )   
  92. throw new ProtocolException("这不是HTTP协议");   
  93. this.target = target;   
  94. } catch(MalformedURLException m) {   
  95. throw new ProtocolException("协议格式错误");   
  96. }   
  97. }   
  98. /*   
  99. * 与Web服务器连接。若找不到Web服务器,InetAddress会引发UnknownHostException   
  100. * 异常。若Socket连接失败,会引发IOException异常。   
  101. */   
  102. protected void openServer(String host,int port) 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. InetAddress address = InetAddress.getByName(host);   
  112. client = new Socket(address,port==-1?80:port);   
  113. sender = new BufferedOutputStream(client.getOutputStream());   
  114. receiver = new BufferedInputStream(client.getInputStream());   
  115. }catch(UnknownHostException u) {   
  116. throw u;   
  117. }catch(IOException i) {   
  118. throw i;   
  119. }   
  120. }   
  121. /* 关闭与Web服务器的连接 */   
  122. protected void closeServer() throws IOException {   
  123. if(client==null) return;   
  124. try {   
  125. client.close(); sender.close(); receiver.close();   
  126. } catch(IOException i) {   
  127. throw i;   
  128. }   
  129. client=nullsender=nullreceiver=null;   
  130. }   
  131. protected String getURLFormat(URL target) {   
  132. String spec = "http://   
  133. +target.getHost();   
  134. if(target.getPort()!=-1)   
  135. spec+=":"+target.getPort();   
  136. return spec+=target.getFile();   
  137. }   
  138. /* 向Web服务器传送数据 */   
  139. protected void sendMessage(String data) throws IOException{   
  140. sender.write(data.getBytes(),0,data.length());   
  141. sender.flush();   
  142. }   
  143. /* 接收来自Web服务器的数据 */   
  144. protected void receiveMessage() throws IOException{   
  145. byte data[] = new byte[1024];   
  146. int count=0;   
  147. int word=-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. String message = new String(data,0,count);   
  159. int mark = 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. case 400:   
  167. throw new IOException("错误请求");   
  168. case 404:   
  169. throw new FileNotFoundException( getURLFormat(target) );   
  170. case 503:   
  171. throw new IOException("服务器不可用" );   
  172. }   
  173. if(word==-1) throw new ProtocolException("信息接收异常终止");   
  174. int symbol=-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) break parseLine;   
  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 = new String(data,0,count);   
  202. mark = message.indexOf(':');   
  203. String key = null;   
  204. if(mark>0) key = message.substring(0,mark);   
  205. mark++;   
  206. while( mark<message.length() && message.charAt(mark)<=32 ) mark++;   
  207. String value = 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 = new ByteArrayInputStream(data,0,count);   
  217. data=null;   
  218. closeServer();   
  219. }   
  220. public String getResponseMessage() {   
  221. return responseMessage;   
  222. }   
  223. public int getResponseCode() {   
  224. return responseCode;   
  225. }   
  226. public String getServerVersion() {   
  227. return serverVersion;   
  228. }   
  229. public InputStream getInputStream() {   
  230. return byteStream;   
  231. }   
  232. public synchronized String getHeaderKey(int i) {   
  233. if(i>=header.size()) return null;   
  234. Enumeration enum = header.propertyNames();   
  235. String key = null;   
  236. for(int j=0; j<=i; j++)   
  237. key = (String)enum.nextElement();   
  238. return key;   
  239. }   
  240. public synchronized String getHeaderValue(int i) {   
  241. if(i>=header.size()) return null;   
  242. return header.getProperty(getHeaderKey(i));   
  243. }   
  244. public synchronized String getHeaderValue(String key) {   
  245. return header.getProperty(key);   
  246. }   
  247. protected String getBaseHeads() {   
  248. String inf = "User-Agent: myselfHttp/1.0\r\n"+   
  249. "Accept: www/source; text/html; image/gif; */*\r\n";   
  250. return inf;   
  251. }   
  252. private byte[] addCapacity(byte rece[]){   
  253. byte temp[] = new byte[rece.length+1024];   
  254. System.arraycopy(rece,0,temp,0,rece.length);   
  255. return temp;   
  256. }   
  257. public static void main(String[] args) {   
  258. Http http=new Http();   
  259. //http.GET("http://192.168.1.5   
  260. );   
  261. int i;   
  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. }   

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值