JAVA編寫的一個簡單的Socket實現的HTTP響應服務器

JAVA編寫的一個簡單的Socket實現的HTTP響應服務器,看後就很容易理解Web服務器的原理了。

[java] view plaincopy
  1. package test.io;  
  2.   
  3. import java.net.*;  
  4. import java.io.*;  
  5.   
  6. /** 
  7.  * 一個簡單的Socket實現的HTTP響應服務器。<br> 
  8.  * 只用於熟悉HTTP協議的目的,可以看到瀏覽器發過來的數據格式。 
  9.  *  
  10.  * @author  */  
  11. public class MyWebServer {  
  12.   public static void main(String[] args) {  
  13.     Socket socket = null;  
  14.     try {  
  15.       // 創建一個監聽8000端口的服務器Socket  
  16.       ServerSocket s = new ServerSocket(80003);  
  17.       System.out.println("MyWebServer等待來自瀏覽器的連接\n");  
  18.       while (true) {  
  19.         socket = s.accept();  
  20.         System.out.println("連接已建立。端口號:" + socket.getPort());  
  21.         new MyWebServerThread(socket).start();  
  22.       }  
  23.     } catch (IOException e) {  
  24.       e.printStackTrace();  
  25.     }  
  26.   }  
  27. }  
  28.   
  29. class MyWebServerThread extends Thread {  
  30.   private Socket socket;  
  31.   
  32.   MyWebServerThread(Socket socket) {  
  33.     this.socket = socket;  
  34.   }  
  35.   
  36.   @Override  
  37.   public void run() {  
  38.     try {  
  39.       InputStreamReader is = new InputStreamReader(socket.getInputStream());  
  40.       char[] bs = new char[2048];  
  41.       PrintStream out;  
  42.       out = new PrintStream(socket.getOutputStream());  
  43.       StringBuilder msg = new StringBuilder();  
  44.       // 如果10毫秒還沒有數據,則視同沒有新的數據了。  
  45.       // 因爲有Keep-Alive的緣故,瀏覽器可能不主動斷開連接的。  
  46.       // 實際應用,會根據協議第一行是GET還是 POST確定。  
  47.       socket.setSoTimeout(10);  
  48.       //  
  49.       // 此處讀入請求數據並做相應的處理  
  50.       //  
  51.       int len = -1;  
  52.       try {  
  53.         while ((len = is.read(bs)) != -1) {  
  54.           msg.append(bs, 0, len);  
  55.           msg.append("\n");  
  56.         }  
  57.       } catch (Exception ex) {  
  58.         // ex.printStackTrace();  
  59.       }  
  60.       // 下面是由服務器直接生成的主頁內容  
  61.       // 1、首先向瀏覽器輸出響應頭信息  
  62.       out.println("HTTP/1.1 200 OK");  
  63.       out.println("Content-Type:text/html;charset:GBK");  
  64.       out.println();  
  65.       // 2、輸出主頁信息  
  66.       out  
  67.           .println("<HTML><BODY>"  
  68.               + "<center>"  
  69.               + "<H1>HTTP協議測試服務器,當前時間:"  
  70.               + new java.util.Date()  
  71.               + "</h1>"  
  72.               + "<form method='get'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='GET測試'/></form><br/>"  
  73.               + "<form method='post'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='POST測試'/></form><br/>"  
  74.               + "<form method='post'  enctype='multipart/form-data'>phototitle:<input type='text' name='phototitle'/>photo:<input type='file' name='photo'/><input type='submit' value='Upload測試'/></form>"  
  75.               + "</center>您提交的數據如下:<pre>" + msg.toString() + "</pre></BODY></HTML>");  
  76.       out.flush();  
  77.       out.close();  
  78.       is.close();  
  79.       System.out.println("close");  
  80.       // 關閉連接  
  81.       socket.close();  
  82.     } catch (IOException e) {  
  83.       e.printStackTrace();  
  84.     }  
  85.   }  
  86. }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章