HTTP協議請求包的Java實現
前面我們對GET方法實現HTTP協議包的過程進行了簡單的介紹,不知道大家是否已經掌握了。那么現在,我們主要分析一下Java中,Socket類與ServerSocket類的協議包的鏈接發送與接收。
在Java中,通信端點由java.net.Socket類(客戶端)或java.net.ServerSocket類(服務器端)表示。應用程序通過端點向網絡發送或從網絡讀取數據。位于兩臺不同機器上的應用軟件通過網絡連接發送和接收字節流,從而實現通信。要把HTTP協議包發送給另一個應用,首先要知道對方的IP地址以及其通信端點的端口號。Socket類代表的是客戶端,它是一個連接遠程服務器應用時臨時創建的端點。
ServerSocker類代表的是服務器端,它啟動后等待來自客戶端的連接請求;一旦接收到請求,ServerSocket創建一個Socket實例來處理與該客戶端的通信。對于服務器應用,我們不知道客戶端應用什么時候會試圖連接服務器,服務器必須一直處于等待連接的狀態。
下面是ServerSocket提供了四個構造函數,常用的構造函數的的一種形式為:
public ServerSocket(int port, int backLog, InetAddress bindingAddress);
參數:port指定服務器端監聽客戶端的端口;
backlog為連接請求的最大隊列長度,一旦超越這個長度,服務器端點開始拒絕客戶端的連接請求。
bindingAddress是一個java.net.InetAddress的實例,指定綁定IP地址。
創建好ServerSocket實例之后,調用它的accept方法,要求它等待傳入的連接請求。只有出現了連接請求時,accept方法才會返回,它的返回值是一個Socket類的實例。隨后,這個Socket對象就可以用來與客戶端應用通信。
Socket類有許多構造函數,常用的為:
public Socket(String host, int port)。參數是主機名稱(IP地址或域名)和端口號。
參數host是遠程機器的名字或IP地址,port是遠程應用的端口號。
成功創建了Socket類的實例之后,我們就可以用它來發送和接收字節流形式的數據,數據一般為HTTP協議包。
要發送字節流,首先要調用Socket類的getOutputStream方法獲得一個java.io.OutputStream對象;要從連接的另一端接收字節流,首先要調用Socket類的getInputStream方法獲得一個java.io.InputStream對象。
下面的代碼片斷創建一個與本地HTTP服務器(127.0.0.1代表本地主機的IP地址)通信的Socket,發送一個HTTP協議請求包,準備接收服務器的應答。#p#
- Socket socket = new Socket("127.0.0.1", "80");
- OutputStream os= socket.getOutputStream();
- InputStreamins = socket.getInputStream();
- StringBuffer sb=new StringBuffer();
- sb.append("GET /index.jsp HTTP/1.1rn");//注意rn為回車換行
- sb.append("Accept-Language: zh-cnrn");
- sb.append("Connection: Keep-Alivern");
- sb.append("Host: 192.168.0.106rn");
- sb.append("Content-Length: 37rn");
- sb.append("rn");
- sb.append("userName=new_andy&password=new_andyrn");
- sb.append("rn");
- //向Web服務器發送一個HTTP請求包
- os.write(sb.toString().getBytes());
- 服務器端的代碼在大致結構為:
- while (!shutdown) {
- Socket socket = null;
- try {socket = serverSocket.accept(); //等待客戶以送HTTP協議請求包
- // 創建HTTP請求包處理線程
- RequestThread request = new RequestThread(socket);
- request.start();
- if(shutdown) System.exit(0);
- }
- catch (Exception e) {
- e.printStackTrace();
- } }
RequestThread線程分析HTTP請求包,跟根據請求包內容在服務端生成一個HTTP應答包。下一節說明怎樣分析HTTP包。
InputStreaminput = socket.getInputStream();//從此字節數據流獲得HTTP請求包內容。
OutputStream output= socket.getOutputStream(); //向此字節流寫入HTTP協議應答包內容。