隨筆 - 40, 文章 - 0, 評論 - 20, 引用 - 0
          數據加載中……

          用Java實現的Html web服務器

          ? 馬上就要開始轉到新的項目組,做一個全新的項目了,對于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");
          ??}
          ?}

          }

          posted on 2006-03-28 13:55 月亮 閱讀(456) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 富阳市| 吉隆县| 隆德县| 岳池县| 涿鹿县| 和林格尔县| 保山市| 兴文县| 周口市| 体育| 麦盖提县| 扎囊县| 巢湖市| 遵义县| 大田县| 阿图什市| 广平县| 凤阳县| 宣汉县| 吉水县| 泸州市| 陈巴尔虎旗| 宜川县| 密云县| 宁海县| 抚州市| 陆川县| 平远县| 商洛市| 延长县| 卓尼县| 元谋县| 澄江县| 峨眉山市| 福海县| 柳州市| 双流县| 安远县| 巴彦淖尔市| 鄯善县| 焦作市|