? 馬上就要開始轉到新的項目組,做一個全新的項目了,對于HTTP協議需要一定的了解,所以周末自己用Java寫了一個簡單的web服務器試試,只能實現簡單的html文件瀏覽。
主要包括三個類:WebServer(監聽瀏覽器請求),SocketThread(處理瀏覽器請求的進程),StringUtil(實現一些公共的操作),下面是三個類的代碼.
----WebServer----
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class WebServer {
?
?public static void main(String[] argv) throws IOException {
??ServerSocket servSocket = new ServerSocket(StringUtil.LISTENING_PORT);
??try {
???while (true) {
????Socket socket = servSocket.accept();
????new SocketThread(socket).start();
???}
??} finally {
???servSocket.close();
??}
?}
}
---SocketThread------
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.Writer;
import java.net.Socket;
public class SocketThread extends Thread {
?private Socket socket = null;
?public SocketThread(Socket s) {
??this.socket = s;
?}
?public void run() {
??try {
???if (socket == null) {
????throw new Exception("==>SOCKET為空<==");
???}
???BufferedReader reader = new BufferedReader(new InputStreamReader(
?????socket.getInputStream()));
???String fileName = "";
???while (true) {
????String str = reader.readLine();
????if (str == null || str.length() <= 0) {
?????break;
????}
????//System.out.println("===>"+str);
????if (StringUtil.isGetRequestInfo(str)) {
?????fileName = StringUtil.getFileName(str);
?????break;
????}
???}
???//System.out.println("===>客戶機IP==>"+socket.getInetAddress().toString());
???//System.out.println("===>客戶機端口==>"+socket.getPort());???
???/*
??? BufferedWriter writer = new BufferedWriter(new
??? OutputStreamWriter(socket.getOutputStream()));
??? */
???PrintStream outputStream = new PrintStream(socket.getOutputStream());
???File file = new File(StringUtil.WEBPATH + fileName);
???if (file.exists()) { //如果文件存在
????StringUtil.sendHttpHead(outputStream, file);
????StringUtil.sendFile(outputStream, file);
????outputStream.flush();
???} else { //文件沒找到,返回404頁面
????StringUtil.send404Page(outputStream);
????outputStream.flush();
???}
??} catch (Exception e) {
???e.printStackTrace();
??} finally {
???try {
????socket.close();
???} catch (Exception e) {
???}
??}
?}
}
---StringUtil-----
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintStream;
/**
?* @author xiaoliang
?*/
public class StringUtil {
?// 服務器監聽的端口
?public static final int LISTENING_PORT = 8080;
?// 服務器文件的位置
?public static final String WEBPATH = "E:";
?/**
? * 判斷該字符串是不是瀏覽器發送過來的請求頭信息
? * @param str
? * @return
? */
?public static boolean isGetRequestInfo(String str) {
??if (str == null || str.length() <= 0)
???return false;
??boolean isGetStr = true;
??if (str.indexOf("GET") != 0) {
???isGetStr = false;
??}
??if (str.indexOf("HTTP/") <= 0) {
???isGetStr = false;
??}
??return isGetStr;
?}
?/**
? * 獲得請求信息中的文件名,默認為index.html
? *
? * @param str
? * @return
? */
?public static String getFileName(String str) {
??String fileName = "index.html", s;
??int httpIndex = str.lastIndexOf("HTTP/");
??s = str.substring(3, httpIndex);
??s = s.trim();
??if (s != null && s.length() > 0 && s.indexOf(".") > 0) {
???fileName = s;
??}
??return fileName;
?}
?/**
? * 發送文件到客戶端
? *
? * @param out
? * @param file
? */
?public static void sendFile(PrintStream out, File file) {
??try {
???DataInputStream in = new DataInputStream(new FileInputStream(file));
???int length = (int) file.length();
???byte[] buffer = new byte[length];
???in.readFully(buffer);
???out.write(buffer, 0, length);
???in.close();
??} catch (Exception e) {
???e.printStackTrace();
??}
?}
?/**
? * 發送返回的頭部信息
? * @param out
? */
?public static void sendHttpHead(PrintStream outputStream, File file) {
??try {
???outputStream.println("HTTP/1.0200OK");
???outputStream.println("Content_Type:text/htm1");
???outputStream.println("Content_Length:" + file.length());
???outputStream.println("Server:moon webserver 1.0");
???outputStream.println("");
??} catch (Exception e) {
???e.printStackTrace();
??}
?}
?/**
? * 返回404頁面
? * @param out
? */
?public static void send404Page(PrintStream out) {
??try {
???out.println("HTTP /1.0 404 no found");
???out.println("Content_type:text/html");
???out.println("");
???out.println("Error404:file not found!");
??} catch (Exception e) {
???e.printStackTrace();
??}
?}
?
?public static void main(String[] argv) {
??String str = "GET /11.html HTTP/1.1";
??str = StringUtil.getFileName(str);
??System.out.println("==>" + str + "<==");
??File file = new File(StringUtil.WEBPATH + str);
??if (file.exists()) {
???System.out.println("exists");
??} else {
???System.out.println("not exists");
??}
?}
}