熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

用Socket類實現HTTP協議客戶端應用

2013-11-23 18:44:50  來源: Java核心技術 

  Http客戶端程序已集成在Java語言中可以通過URLConnection類調用遺憾的
  是由於SUN沒有公布Http客戶程序的源碼它實現的細節仍是一個謎本文根據HTTP
  協議規范Socket類實現一個HTTP協議客戶端程序
  
  Socket類:
  了解TCP/IP協議集通信的讀者知道協議間的通信是通過Socket完成的
  包中Socket類就是對Socket的具體實現它通過連接到主機後返回一個
  I/O流實現協議間的信息交換
  
   HTTP協議
  HTTP協議同其它TCP/IP協議集中的協議一樣是遵循客戶/服務器模型工作的
  戶端發往服務端的信息格式如下:
  
  請求方法 URL HTTP協議的版本號
  提交的元信息
  **空行**
  實體
  
  請求方法是對這次連接工作的說明目前HTTP協議已經發展到它包括GET
  HEADPOSTDELETEOPTIONSTRACEPUT七種元信息是關於當前請求的信息
  過分析元信息可以檢查實體數據是否完整接收過程是否出錯類型是否匹配等
  信息的引入使HTTP協議通信更加穩妥可靠實體是請求的具體內容
  將上述報文發往Web服務器如果成功應答格式如下:
  
  HTTP協議的版本號 應答狀態碼 應答狀態碼說明
  接收的元信息
  **空行**
  實體
  
  以上報文發向客戶端並且接收成功彼此間關閉連接完成一次握手
  下面用最常用的GET方法來說明具體的報文應用
  
  GET HTTP/
  accept: www/source; text/html; image/gif; image/jpeg; */*
  User_Agent: myAgent
  **空行**
  
  這個報文是向主機請求一個缺省HTML文檔客戶端HTTP協議版本
  號是元信息包括可接收的文件格式用戶代理每一段之間用回車換行符分
  隔最後以一個空行結束發向服務器後如果執行過程正常服務器返回以下代碼:
  
  HTTP/ OK
  Date: Tue Sep :: GMT
  Server: Apache/
  Connection: close
  ContentType: text/html
  **空行**
  
  
  HTTP/表示這個HTTP服務器是是服務器對客戶請求的應答狀態碼OK
  是對應答狀態碼的解釋之後是這個文檔的元信息和文檔正文(相關應答狀態碼和元
  信息的解釋請參閱Inetrnet標准草案:RFC)
  
   HTTP客戶端程序:
  
  import *;
  import javaio*;
  import javautilProperties;
  import javautilEnumeration;
  public class Http {
  protected Socket client;
  protected BufferedOutputStream sender;
  protected BufferedInputStream receiver;
  protected ByteArrayInputStream byteStream;
  protected URL target;
  private int responseCode=;
  private String responseMessage=;
  private String serverVersion=;
  private Properties header = new Properties();
  public Http() { }
  public Http(String url) {
  GET(url) ;
  }
  /* GET方法根據URL會請求文件數據庫查詢結果程序運行結果等多種內容 */
  public void GET(String url) {
  try {
  checkHTTP(url);
  openServer(targetgetHost()targetgetPort() );
  String cmd = GET + getURLFormat(target) + HTTP/\r\n
  + getBaseHeads()+\r\n;
  sendMessage(cmd);
  receiveMessage();
  }catch(ProtocolException p) {
  pprintStackTrace();
  return;
  }catch(UnknownHostException e) {
  eprintStackTrace();
  return;
  }catch(IOException i)
  
  iprintStackTrace();
  return;
  }
  }
  
  /*
  * HEAD方法只請求URL的元信息不包括URL本身若懷疑本機和服務器上的
  * 文件相同用這個方法檢查最快捷有效
  */
  public void HEAD(String url) {
  try {
  checkHTTP(url);
  openServer(targetgetHost()targetgetPort() );
  String cmd = HEAD +getURLFormat(target)+ HTTP/\r\n
  +getBaseHeads()+\r\n;
  sendMessage(cmd);
  receiveMessage();
  }catch(ProtocolException p) {
  pprintStackTrace();
  return;
  }catch(UnknownHostException e) {
  eprintStackTrace();
  return;
  }catch(IOException i)
  
  iprintStackTrace();
  return;
  }
  }
  /*
  * POST方法是向服務器傳送數據以便服務器做出相應的處理例如網頁上常用的
  * 提交表格
  */
  public void POST(String urlString content) {
  try {
  checkHTTP(url);
  openServer(targetgetHost()targetgetPort() );
  String cmd = POST + getURLFormat(target) +
  HTTP/\r\n+getBaseHeads();
  cmd += Contenttype: application/xwwwformurlencoded\r\n;
  cmd += Contentlength: + contentlength() + \r\n\r\n;
  cmd += content+\r\n;
  sendMessage(cmd);
  receiveMessage();
  }catch(ProtocolException p) {
  pprintStackTrace();
  return;
  }catch(UnknownHostException e) {
  eprintStackTrace();
  return;
  }catch(IOException i)
  
  iprintStackTrace();
  return;
  }
  
  }
  protected void checkHTTP(String url) throws ProtocolException {
  try {
  URL target = new URL(url);
  if(target==null || !targetgetProtocol()toUpperCase()equals(HTTP) )
  throw new ProtocolException(這不是HTTP協議);
  thistarget = target;
  }catch(MalformedURLException m) {
  throw new ProtocolException(協議格式錯誤);
  }
  }
  /*
  * 與Web服務器連接若找不到Web服務器InetAddress會引發UnknownHostException
  * 異常若Socket連接失敗會引發IOException異常
  */
  protected void openServer(String hostint port) throws
  UnknownHostExceptionIOException {
  headerclear();
  responseMessage=; responseCode=;
  try {
  if(client!=null) closeServer();
  if(byteStream != null) {
  byteStreamclose(); byteStream=null;
  }
  InetAddress address = InetAddressgetByName(host);
  client = new Socket(addressport==?:port);
  sender = new BufferedOutputStream(clientgetOutputStream());
  receiver = new BufferedInputStream(clientgetInputStream());
  }catch(UnknownHostException u) {
  throw u;
  }catch(IOException i) {
  throw i;
  }
  }
  /* 關閉與Web服務器的連接 */
  protected void closeServer() throws IOException {
  if(client==null) return;
  try {
  clientclose(); senderclose(); receiverclose();
  }catch(IOException i) {
  throw i;
  }
  client=null; sender=null; receiver=null;
  }
  protected String getURLFormat(URL target) {
  String spec = //+targetgetHost();
  if(targetgetPort()!=)
  spec+=:+targetgetPort();
  return spec+=targetgetFile();
  }
  
  /* 向Web服務器傳送數據 */
  protected void sendMessage(String data) throws IOException{
  senderwrite(datagetBytes()datalength());
  senderflush();
  }
  /* 接收來自Web服務器的數據 */
  protected void receiveMessage() throws IOException{
  byte data[] = new byte[];
  int count=;
  int word=;
  // 解析第一行
  while( (word=receiverread())!= ) {
  if(word==\r||word==\n) {
  word=receiverread();
  if(word==\n) word=receiverread();
  break;
  }
  if(count == datalength) data = addCapacity(data);
  data[count++]=(byte)word;
  }
  String message = new String(datacount);
  int mark = messageindexOf();
  serverVersion = messagesubstring(mark);
  while( mark  responseCode = Integer.parseInt(message.substring(mark+1,mark+=4));
  responseMessage = message.substring(mark,message.length()).trim();

From:http://tw.wingwit.com/Article/program/Java/hx/201311/25660.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.