Servlet制作的Web服务器!(源码)
2008-10-15 15:29
337 查看
新建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();
}
}
在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();
}
}
相关文章推荐
- 刚用Servlet制作的Web服务器!(源码)
- JSP+Servlet制作Java Web登录功能的全流程解析
- JSP+Servlet制作Java Web登录功能的全流程解析
- Web服务器与Servlet容器
- 制作五子棋小游戏单机/在线联网对弈手把手精致设计含游戏服务器源码3
- 各种容器与服务器的区别与联系:Servlet容器 WEB容器 Java EE容器 应用服务器 WEB服务器 Java EE服务器
- maven项目管理 集成常见错误一解决:spring 在启动服务器的时候报错 Could not open ServletContext resource [/WEB-INF/dispather-se
- Tomcat实现:Servlet与web.xml介绍 以及 源码分析Tomcat实现细节
- Servlet容器Tomcat中web.xml中url-pattern的配置详解[附带源码分析]
- CentOS 7上源码编译安装和配置LNMP Web+phpMyAdmin服务器环境
- liunx服务(Nginx服务器 web服务器源码包和rpm 服务平滑升级)
- Servlet容器Tomcat中web.xml中url-pattern的配置详解[附带源码分析]
- Servlet容器Tomcat中web.xml中url-pattern的配置详解[附带源码分析]
- JavaWeb -- 服务器传递给Servlet的对象 -- ServletConfig, ServletContext,Request, Response
- RedHat 5.4下Web服务器架构之源码构建LAMP环境及应用phpwind(上)
- 源码安装nginx——web服务器
- servlet通过web.xml配置在服务器启动时自动启动
- Web项目部署到服务器访问Servlet 404
- 源码发布服务器同步到N台WEB服务器
- 浅谈Servlet的Web服务器