首先瞭解Java socket。Java定義了兩個十分重要的類:SocketServer和Socket。從它們的名字就可以看出它們各自的用途。 SocketServer用於作為伺服器端的程式,Socket用於連結的伺服器的用戶端程式。需要注意的是,這兩個類只有在串連初始的時候有所區別,當連 接一旦建立,伺服器端和用戶端就是兩個對等的實體,兩端都可以讀和寫。
所有的讀操作都是由InputStream類來完成,所有的寫操作都是有OutputStream類來完成。但是這兩個類都是比較低級的類,它們只負責位元組流的傳輸。因此很少直接使用它們來讀寫資料。
對於輸入資料流(InputStream)有兩個常用的類:DataInputStream和BufferedReader。其中DataInputStream用於從socket流中讀位元據,例如16位或者32位整數。BufferedReader則是按行讀取。
對於輸出資料流(OutputStream)同樣有兩個常用類:DataOutputStream和PrintWriter,它們分別對應於輸入資料流的兩個類,一個是寫位元據,一個是按行寫資料。
下面簡單瞭解一下HTTP協議(Hypertext Transfer Protocol)。首先需要明白,HTTP包分兩部分,header和body,它們之間用一個空行分割開來。請求有幾種方式,比如GET,POST, 就不贅述了,需要詳細瞭解的可以翻看相關書籍或直接閱讀RFC。
基礎知識就是這些,下面可以進行一點編程工作。
以下將要編寫一個十分十分簡單的web server,不論用戶端的請求是什麼,它只返回一個十分十分簡單的HTML頁面。
import java.net.*;import java.io.*; /** * A very simple web server. * @author zhhailon */public class MiniWebServer { protected void start() { ServerSocket s; System.out.println("MiniWebServer starting up on port 8080"); System.out.println("(press ctrl-c to exit)"); try { // 建立伺服器端socket s = new ServerSocket(8080); } catch (Exception e) { System.out.println("Error: " + e); return; } System.out.println("Waiting for connection"); for (;;) { try { // 等待串連 Socket remote = s.accept(); // accept()返回一個串連的socket,即用戶端 System.out.print("Connection, sending data."); // 還記得BufferedReader嗎,按行讀入 BufferedReader in = new BufferedReader( new InputStreamReader(remote.getInputStream())); // 還記得PrintWriter嗎,按行寫出 PrintWriter out = new PrintWriter(remote.getOutputStream()); // 讀取資料,我們將忽略讀取的內容,直到讀到一個空行 // 記住HTTP頭是以一個空行標示結束的,我們不關心它的內容 String str = "."; while (!str.equals("")) { str = in.readLine(); } // 發送響應 // 發送HTTP頭 out.println("HTTP/1.0 200 OK"); out.println("Content-Type: text/html"); out.println("Server: SimpleWebServer"); // 別忘了一個空行 out.println(""); // 發送HTML頁面 out.println("OK, I'm the ugly page.. Welcome.."); // flush()確保所有資料都傳送出去了 out.flush(); // 關閉串連 remote.close(); } catch (Exception e) { System.out.println("Error: " + e); } } } /** * * @param args */ public static void main(String[] args) { MiniWebServer ws = new MiniWebServer(); ws.start(); }}
由於我的電腦中80連接埠被佔用,我選擇監聽8080連接埠。接著javac,java,試試我們的Mini Web Server,開啟瀏覽器,輸入http://localhost:8080/,顯示OK, I’m the ugly page.. Welcome..
Above all,簡單介紹了Java中socket的用法,實踐了一個小的web server。始終堅信實踐出真知,所以要多coding啊!