簡單的java web服務器實例

  編寫使用java語言實現的Web服務器,主要經過使用java socket 編程來實現,使用java socket編程不只能夠編寫web服務器,還能夠編寫其餘網絡應用。html

WebServer.javajava

package webbook.chapter2;web

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;編程

public class WebServer {
 /** 默認使用的服務器Socket端口號 */
 public static final int HTTP_PORT = 8080;
 private ServerSocket serverSocket;瀏覽器

 public void startServer(int port) {
  try {
   serverSocket = new ServerSocket(port);
   System.out.println("Web Server startup on  " + port);
   while (true) {
    Socket socket = serverSocket.accept();
    // 經過線程的方式來處理客戶的請求
    new Processor(socket).start();
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }服務器

 /**
  * WebServer類的啓動方法,能夠經過命令行參數指定當前Web服務器所使用的端口號。
  */
 public static void main(String[] argv) throws Exception {
  WebServer server = new WebServer();
  if (argv.length == 1) {
   server.startServer(Integer.parseInt(argv[0]));
  } else {
   server.startServer(WebServer.HTTP_PORT);
  }
 }
}
網絡

Processor.javaeclipse

package webbook.chapter2;socket

import java.io.*;
import java.net.Socket;ui

/**
 * 處理一個HTTP用戶請求的線程類。
 */
public class Processor extends Thread {
 private PrintStream out;
 private InputStream input;
 /** 默認的服務器存放訪問內容的目錄D:\eclipse3.4\workspace03 */
 public static final String WEB_ROOT = "d:\\eclipse3.4\\workspace03\\webserver2\\htdocs";

 public Processor(Socket socket) {
  try {
   input = socket.getInputStream();
   out = new PrintStream(socket.getOutputStream());
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 public void run() {
  try {
   String fileName = parse(input);
   readFile(fileName);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 /**
  * 解析客戶機發過的全部HTTP請求,若是是符合HTTP協議內容的, 就分析出客戶機所要訪問文件的名字,而且返回文件名。
  */
 public String parse(InputStream input) throws IOException {
  BufferedReader in = new BufferedReader(new InputStreamReader(input));
  String inputContent = in.readLine();
  if (inputContent == null || inputContent.length() == 0) {
   sendError(400, "Client invoke error");
   return null;
  }
  // 分析客戶請求的HTTP信息,分析出到底想訪問哪一個文件,
  // 發過來的HTTP請求應該是三部分。

  String request[] = inputContent.split(" ");
  if (request.length != 3) {
   sendError(400, "Client invoke error");
   return null;
  }
  // 第一部分是請求的方法
  String method = request[0];
  // 第二部分是請求的文件名
  String fileName = request[1];
  // 第三部分是HTTP版本號
  String httpVersion = request[2];
  System.out.println("Method: " + method + ", file name: " + fileName + ", HTTP version: " + httpVersion);
  return fileName;
 }

 /**
  * 處理調用一個文件的請求
  */
 public void readFile(String fileName) throws IOException {
  File file = new File(Processor.WEB_ROOT + fileName);
  if (!file.exists()) {
   sendError(404, "File Not Found");
   return;
  }
  // 把文件的內容讀取到in對象中。
  InputStream in = new FileInputStream(file);
  byte content[] = new byte[(int) file.length()];
  in.read(content);
  out.println("HTTP/1.0 200 sendFile");
  out.println("Content-length: " + content.length);
  out.println();
  out.write(content);
  out.flush();
  out.close();
  in.close();
 }

 /**
  * 發送錯誤的信息
  */
 public void sendError(int errNum, String errMsg) {
  out.println("HTTP/1.0 " + errNum + " " + errMsg);
  out.println("Content-type:text/html");
  out.println();
  out.println("<html>");
  out.println("<meta content='text/html; charset=gb2312' http-equiv='Content-Type'/>");
  out.println("<head><title>Error " + errNum + "--" + errMsg + "</title></head>");
  out.println("<h1>" + errNum + " " + errMsg + "</h1>");
  out.println("</html>");
  out.println();
  out.flush();
  out.close();
  System.out.println(errNum+",,,,"+errMsg);
 }
}

在「e:\workspace\webserver」 目錄下創建一個htdocs目錄,存放須要被訪問的html文件等資源。而後運行WebServer類,啓動這個Web服務器程序,就能夠經過瀏覽器訪問這個服務器了。http://localhost:8080/welcome.html

其實看書仍是很重要的,許多細節都在書中有解釋。以上例子就是在翻看兩年前發的書上看到的。初學時不必定能看懂,但等過了許久回過頭來一看原來如此。。。

相關文章
相關標籤/搜索