刚用Servlet制作的Web服务器!(源码)

简介:

 前不久做完SSH留言板以后,打算先从Struts开始,打好基础,但是由于教程版本有点旧,本来实现一些简单的操作,但是实现方法却是十分复杂。我和其他人

 

弄了两天还是没解决。于是打算先放一放,这两天好好看了看Servlet,做了这个Java版的简易Web服务器,并且测试通过。

 

通过这个Java项目,可以加深我对Http协议的深刻认识。

 

下面是代码和实现方法:

 

新建Java Project

 

在src下新建一个包,插入两个Java文件。

 

代码如下:

WebServer.java

 

package 包名;

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.java

 

package 包名;

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

/**
 * 处理一个HTTP用户请求的线程类。
 */
public class Processor extends Thread {
 private PrintStream out;
 private InputStream input;
 /** 默认的服务器存放访问内容的目录 */
 public static final String WEB_ROOT = ".......";(访问文件的本地路径,之间用“\\”隔开)

 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;
  }
  // 第一部分是HTTP状态码
  String stateCode = request[0];
  // 第二部分是请求的文件名
  String fileName = request[1];
  // 第三部分是HTTP版本号
  String httpVersion = request[2];
  System.out.println("State Code: " + stateCode + ", 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("<head><title>Error " + errNum + "--" + errMsg + "</title></head>");
  out.println("<h1>" + errNum + " " + errMsg + "</h1>");
  out.println("</html>");
  out.println();
  out.flush();
  out.close();
 }
}

 

就这么简单的Web服务器。但是很好的反映了Http协议的机制。

 

今后如果有一定基础的话,还可以研究一下MINA和Cindy的Web服务器框架。这两个框架很强大。一些Java做的网游都会用。


本文转自施杨博客园博客,原文链接:http://www.cnblogs.com/shiyangxt/archive/2008/07/23/1249854.html,如需转载请自行联系原作者

相关文章
|
1月前
|
存储 资源调度 应用服务中间件
浅谈本地开发好的 Web 应用部署到 ABAP 应用服务器上的几种方式
浅谈本地开发好的 Web 应用部署到 ABAP 应用服务器上的几种方式
26 0
|
1月前
|
网络协议 Shell 网络安全
实验目的1.编译安装httpd2.优化路径3.并将鲜花网站上传到web服务器为网页目录4.在客户机访问网站http://www.bdqn.com
实验目的1.编译安装httpd2.优化路径3.并将鲜花网站上传到web服务器为网页目录4.在客户机访问网站http://www.bdqn.com
163 0
|
24天前
|
前端开发 应用服务中间件 nginx
使用Docker快速搭建Web服务器Nginx
本文指导如何使用Docker快速搭建Nginx服务器。首先,通过`docker pull`命令获取Nginx镜像,然后以容器形式运行Nginx并映射端口。通过挂载目录实现本地文件与容器共享,便于自定义网页。使用`docker ps`检查运行状态,访问IP:8088确认部署成功。最后,介绍了停止、删除Nginx容器的命令,强调Docker简化了服务器部署和管理。
39 0
|
1月前
|
SQL 存储 数据库
基于Web技术的在线考试系统的设计与实现(论文+源码)_kaic
基于Web技术的在线考试系统的设计与实现(论文+源码)_kaic
|
29天前
Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】
Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】
14 0
|
1月前
|
Java 关系型数据库 MySQL
基于Web的影院信息管理系统设计与实现(论文+源码)_kaic
基于Web的影院信息管理系统设计与实现(论文+源码)_kaic
|
1月前
|
Windows
Windows Server 各版本搭建 Web 服务器实现访问本地 Web 网站(03~19)
Windows Server 各版本搭建 Web 服务器实现访问本地 Web 网站(03~19)
53 2
|
1月前
|
机器学习/深度学习 Python
Python基础:构建一个简单的Web服务器
Python基础:构建一个简单的Web服务器
51 1
|
1月前
|
应用服务中间件 Apache nginx
web后端-web服务器对比
web后端-web服务器对比
|
1月前
|
存储 测试技术 数据库
基于WEB的院校课程管理系统设计与实现(论文+源码)_kaic
基于WEB的院校课程管理系统设计与实现(论文+源码)_kaic

热门文章

最新文章