前不久做完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做的网游都会用。
好了就到这里了!
施杨出品!!!
分享到:
相关推荐
基于java的开发源码-一个支持servlet的web服务器.zip 基于java的开发源码-一个支持servlet的web服务器.zip 基于java的开发源码-一个支持servlet的web服务器.zip 基于java的开发源码-一个支持servlet的web服务器.zip ...
Java源码:一个支持Servlet的Web服务器 在Java开发领域,Servlet是用于构建动态Web应用程序的重要组件。这个压缩包中的源码提供了一个简单的Web服务器实现,它能够支持Servlet的执行。通过研究这份源码,我们可以...
Java Web服务器源码是开发者学习和理解Web服务工作原理的重要资源。这个源码实现了一种标准的Web服务器,它遵循了HTTP协议,并且兼容了Java Servlet API,这意味着它能够处理和响应HTTP请求,为Java Web应用程序提供...
“综合资源”可能指的是这个压缩包不仅包含Web服务器软件,还可能包括示例应用、配置文件、教程文档等,帮助用户全面了解如何使用和支持Servlet的Web服务器。 总之,一个支持Servlet的Web服务器是Java Web开发的...
JAVA源码一个支持servlet的web服务器
在Java Web开发中,Servlet是一种常用的服务器端组件,用于处理HTTP请求并生成动态内容。本文将详细介绍如何在Servlet环境中集成KindEditor,一个功能强大的在线文本编辑器,以及如何实现本地图片上传的功能。...
标题中的“Java开发的简单WEB服务器源码Java实用源码整理learns”表明这是一个关于Java Web服务器开发的项目,可能是为了教学或者学习目的而编写的。这个项目可能包含了一个简单的HTTP服务器实现,允许用户理解Web...
java源码资源一个支持servlet的web服务器提取方式是百度网盘分享地址
本实例源码提供了一个基于Java实现的web服务器,该服务器支持Servlet,使得开发者能更好地理解和实践Java Web开发的核心概念。 在Java中,Servlet是一个实现了Servlet接口的类,它接收并响应来自Web客户端的请求。...
标题中的“fuwu.rar_web服务器servlet”表明这是一个与Web服务器和Servlet相关的压缩包文件,可能包含用于学习或开发的代码示例。Servlet是Java语言中用于构建动态Web应用程序的一个核心组件,它允许开发者在服务器...
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
Servlet是一种服务器端的Java应用... Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。
1. **Servlet基础**:Servlet是Java编程语言中用于扩展服务器功能的接口,它允许开发人员创建动态、交互式的Web应用。Servlet通过处理HTTP请求,生成响应,并将其返回给客户端。 2. **Servlet生命周期**:Servlet在...
Servlet技术是Java Web开发的核心,它为Web应用程序提供了服务器端的编程接口。Jakarta Servlet API 4.0是Servlet规范的最新版本,它包含了对HTTP协议处理、生命周期管理、会话跟踪、安全性和性能优化等方面的全面...
总的来说,深入理解Servlet源码有助于提升我们的Java Web开发技能,使我们能够更高效地解决问题,编写出更健壮、更高效的Web应用程序。通过实践和反编译,我们可以将理论知识转化为实际操作,进一步巩固对Servlet的...
- **加载与实例化**:当Web服务器启动或第一次接收到对Servlet的请求时,会加载Servlet类并创建其实例。 - **初始化**:Servlet实例被创建后,会调用`init()`方法进行初始化,一般用于设置Servlet的内部状态。 - ...
5. **Servlet配置**:Servlet可以通过在web.xml文件中声明,或者使用Java注解(@WebServlet)进行配置。配置包括Servlet的URL映射、初始化参数、负载平衡策略等。 6. **多线程安全**:由于Servlet容器通常为每个...
在标题"Servlet过滤器的简单使用源码+文档"中,我们可以理解为这个压缩包包含了一个关于Servlet过滤器的基础应用示例,以及相关的源代码和文档资料。描述中提到的"实现一个登陆界面",表明了过滤器可能被用作验证...
总的来说,这个"Servlet小例子源码"涵盖了Java Web开发的基础知识,是学习和理解Servlet、Filter和Listener功能和用法的理想资源。通过深入研究和实践,初学者可以快速提升自己的Java Web开发技能。
【Java开发的WEB服务器源码解析】 在毕业设计中,选择使用Java开发Web服务器是一项具有挑战性和技术性的任务。这个项目旨在让学生深入了解Web服务器的工作原理,以及如何利用编程语言实现这些功能。Java作为一种多...