?? httpd.java
字號:
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
/**
* 一個簡單的Web服務器實例
* 沒有考慮安全,沒有配置管理,不支持CGI和Servlets
* 此版本是多線程的,I/O處理在Handler類當中實現
**/
public class Httpd {
/** Web服務器的缺省服務斷口 */
public static final int HTTP = 80;
/** 用來接受客戶端連接的服務器端Socket */
protected ServerSocket sock;
/** 用于讀取Web服務器的配置信息 */
protected Properties wsp;
/** 用于讀取Web服務器的MIMI類型信息 */
protected Properties mimeTypes;
/** Web服務器的根目錄 */
protected String rootDir;
public static void main(String argv[]) {
System.out.println("Our JavaWeb Server 0.1 starting...");
Httpd w = new Httpd();
// 解析命令行參數,在制定端口啟動Web服務器
if (argv.length == 2 && argv[0].equals("-p")) {
w.startServer(Integer.parseInt(argv[1]));
} else {
w.startServer(HTTP);// 在缺省端口啟動Web服務器
}
// 開始監聽服務端口,等待用戶連接
w.runServer();
}
/** 此Web服務器的主要功能函數. 每有一個客戶端連接
* ServerSocket的 accept() 方法返回一個用于I/O的Scoket,
* 我們把這個Scoket傳遞給Handler的構造函數,構造一個線程實例,
* 然后啟動此線程實例,它負責處理用戶的請求.
**/
void runServer() {
while (true) {
try {
// 接受用戶連接請求
Socket clntSock = sock.accept();
// 創建并且啟動處理用戶請求的線程
new Handler(this, clntSock).start();
} catch(IOException e) {
System.err.println(e);
}
}
}
/** 在指定的端口構造一個Web */
Httpd() {
super();
// 讀取此Web服務器的缺省配置信息,
wsp=loadProps("httpd.properties");
// 設置Web服務器的根目錄
rootDir = wsp.getProperty("rootDir", ".");
// 設置Web服務器的MIMI類型屬性
mimeTypes = loadProps(wsp.getProperty("mimeProperties", "mime.properties"));
}
/** 在指定端口啟動Web服務器 */
public void startServer(int portNum) {
String portNumString = null;
if (portNum == HTTP) { // 缺省端口
// 根據配置文件讀取服務器端口
portNumString = wsp.getProperty("portNum");
if (portNumString != null) {
portNum = Integer.parseInt(portNumString);
}
}
try {
// 建立新的服務器端Socket,并在制定端口監聽
sock = new ServerSocket(portNum);
} catch(NumberFormatException e) {
System.err.println("Httpd: \"" + portNumString +
"\" not a valid number, unable to start server");
System.exit(1);
} catch(IOException e) {
System.err.println("Network error " + e);
System.err.println("Unable to start server");
System.exit(1);
}
}
/** 讀取配置信息 */
protected Properties loadProps(String fname) {
Properties sp = new Properties();
try {
// 創建要讀取的配置文件的對象
FileInputStream ifile = new FileInputStream(fname);
// 讀取文件
sp.load(ifile);
} catch (FileNotFoundException notFound) {
System.err.println(notFound);
System.exit(1);
} catch (IOException badLoad) {
System.err.println(badLoad);
System.exit(1);
}
return sp;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -