用Java實現一個Mini Web Server

來源:互聯網
上載者:User

首先瞭解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啊!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.