JAVA編寫的一個簡單的Socket實現的HTTP響應服務器,看後就很容易理解Web服務器的原理了。
- package test.io;
- import java.net.*;
- import java.io.*;
- /**
- * 一個簡單的Socket實現的HTTP響應服務器。<br>
- * 只用於熟悉HTTP協議的目的,可以看到瀏覽器發過來的數據格式。
- *
- * @author */
- public class MyWebServer {
- public static void main(String[] args) {
- Socket socket = null;
- try {
- // 創建一個監聽8000端口的服務器Socket
- ServerSocket s = new ServerSocket(8000, 3);
- System.out.println("MyWebServer等待來自瀏覽器的連接\n");
- while (true) {
- socket = s.accept();
- System.out.println("連接已建立。端口號:" + socket.getPort());
- new MyWebServerThread(socket).start();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- class MyWebServerThread extends Thread {
- private Socket socket;
- MyWebServerThread(Socket socket) {
- this.socket = socket;
- }
- @Override
- public void run() {
- try {
- InputStreamReader is = new InputStreamReader(socket.getInputStream());
- char[] bs = new char[2048];
- PrintStream out;
- out = new PrintStream(socket.getOutputStream());
- StringBuilder msg = new StringBuilder();
- // 如果10毫秒還沒有數據,則視同沒有新的數據了。
- // 因爲有Keep-Alive的緣故,瀏覽器可能不主動斷開連接的。
- // 實際應用,會根據協議第一行是GET還是 POST確定。
- socket.setSoTimeout(10);
- //
- // 此處讀入請求數據並做相應的處理
- //
- int len = -1;
- try {
- while ((len = is.read(bs)) != -1) {
- msg.append(bs, 0, len);
- msg.append("\n");
- }
- } catch (Exception ex) {
- // ex.printStackTrace();
- }
- // 下面是由服務器直接生成的主頁內容
- // 1、首先向瀏覽器輸出響應頭信息
- out.println("HTTP/1.1 200 OK");
- out.println("Content-Type:text/html;charset:GBK");
- out.println();
- // 2、輸出主頁信息
- out
- .println("<HTML><BODY>"
- + "<center>"
- + "<H1>HTTP協議測試服務器,當前時間:"
- + new java.util.Date()
- + "</h1>"
- + "<form method='get'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='GET測試'/></form><br/>"
- + "<form method='post'>username:<input type='text' name='username'/>password:<input type='text' name='password'/><input type='submit' value='POST測試'/></form><br/>"
- + "<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>"
- + "</center>您提交的數據如下:<pre>" + msg.toString() + "</pre></BODY></HTML>");
- out.flush();
- out.close();
- is.close();
- System.out.println("close");
- // 關閉連接
- socket.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }