计算机网络原理——实验一Windows 环境下用 java 实现web 服务器
后台-插件-广告管理-内容页头部广告(手机) |
一.实验目的和意义
(1) 处理一个 http 请求
(2) 接收并解析 http 请求
(3) 从服务器文件系统中获得被请求的文件
(4) 创建一个包括被请求的文件的 http 响应信息
(5) 直接发送该信息到客户端 通过本实验,使学生能够进一步理解 HTTP 协议的技术细节以及 WEB 服务器的实现原理
二.实验过程
(1)前期准备
两个 java 代码文件,分别命名为:“HttpRequest.java”和“WebServer.java”。
两个带跳转的测试网页“index.html”和“next.html”以及其各自包含的图片“1.jpg”和“2.jpg” HttpRequest.java 的主要功能为:获取 http 请求中的套接字的输入流和输出流,即完成“对 从服务器端发回的数据流”和“将要发送到服务器端的数据流”的处理和输出。
WebServer.java 的主要功能为:创建线程,连续创建套接字以及处理 http 请求。
(2)测试阶段
我们使用 jdk 的 javac 指令对 java 代码进行编译,然后启动服务器的默认端口 8080(代码中 预设),然后在 EDGE 浏览器中对各种情况进行测试和检测输出,具体步骤如下。
1.首先我们在 cmd 中,利用 javac 命令编译 main 方法所在的 Java 文件“WebServer.java”,启 动服务器,具体如下:
2.在浏览器中需要输入网址“localhost:8080/index.html”,页面显示和终端输出情况如下:
3.点击 NEXT PAGE TEST,页面显示和终端输出情况如下:
4. 测 试 一 下 错 误 路 径 的 文 件 访 问 结 果 , 在 浏 览 器 中 输 入 一 个 错 误 的 网 址 如 “localhost:8888/123.html”,页面显示和终端输出如下:
经过运行及验证,该 web 服务器的功能正常。
三.实验分析和总结
1.遇到的问题
1) 运行 java 文件和打开 html 文件时会出现乱码,应该在文件保存时将编码改为 ANSI。
2) java 文件名要和类名相同(没学 java 好懵 oo)
3) 两个 html 文件中的地址设为绝对地址就找不到界面了,改成相对地址就能成功运行, 不知道为什么。。。
2.收获与心得
通过本次实验,加深了我对基于 HTTP 协议的客户/服务器模式的信息交换分四个过程建立连接、发送请求信息、发送响应信息、关闭连接以及 WEB 服务器的实现原理的理解,以及学习了如何编写 html 网页。
四、代码附录
- /*index.html*/
- html>
- <html>
- <head>
- <TITLE>Java Web 服务器TITLE>
- <h1>Windows 环境下用 java 实现 Web 服务器实验-学号h1>
- head>
- <body>
- <h2>NETWORK HOMEWORKh2>
- <a href="http://localhost:8888/next.html">NEXT PAGE TESTa>
- <body background="images\1.jpg">body>
- html>
- /*next.html*/
- html>
- <head>
- <TITLE>Java Web 服务器TITLE>
- <h1>Windows 环境下用 java 实现 Web 服务器实验-学号h1>
- head>
- <body>
- <h2>This is the second pageh2>
- <a href="http://localhost:8888/index.html">back
- <body background="images\2.jpg">body>
- html>
- /*WebServer.java*/
- import java.io.* ;
- import java.net.* ;
- import java.util.* ;
- public final class WebServer {
- public static void main(String argv[]) throws Exception {
- int port=8888;
- // 建立一个套接字
- ServerSocket socket = new ServerSocket(port);
- while (true) {
- // 监听一个tcp连接的request.
- Socket connection = socket.accept();
- // 处理HTTP请求消息。
- HttpRequest request = new HttpRequest(connection);
- // 建立一个线程处理请求
- Thread thread = new Thread(request);
- thread.start();
- }
- }
- }
- /*HttpRequest.java*/
- import java.io.* ;
- import java.net.* ;
- import java.util.* ;
- final class HttpRequest implements Runnable {
- final static String CRLF = "\r\n";
- Socket socket;
- public HttpRequest(Socket socket) throws Exception {
- this.socket = socket;
- }
- public void run() {
- try {
- processRequest();
- }
- catch (Exception e) {
- System.out.println(e);
- }
- }
- private void processRequest() throws Exception {
- InputStream is = socket.getInputStream();
- DataOutputStream os = new DataOutputStream(socket.getOutputStream());
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- // 获取http的request信息
- String requestLine = br.readLine();
- // 从请求行中提取文件信息
- StringTokenizer tokens = new StringTokenizer(requestLine);
- tokens.nextToken();
- // GET之后为文件名
- String fileName = tokens.nextToken();
- fileName = "." + fileName ;
- FileInputStream fis = null ;
- boolean fileExists = true ;
- //判断文件是否查询到
- try {
- fis = new FileInputStream(fileName);
- }
- catch (FileNotFoundException e) {
- fileExists = false ;
- }
- //测试输出
- System.out.println("\n*************Request**************\n");
- System.out.println(requestLine);
- String headerLine = null;
- while ((headerLine = br.readLine()).length() != 0) {
- System.out.println(headerLine);
- }
- // 构造response信息
- String statusLine = null;
- String contentTypeLine = null;
- String entityBody = null;
- if (fileExists) {
- //执行成功的话返回“200 OK”
- statusLine = "HTTP/1.0 200 OK" + CRLF;
- contentTypeLine = "Content-Type: "+contentType(fileName) + CRLF;
- }
- else {
- //执行失败,文件未找到的时候返回“404 File Not Found”
- statusLine = "HTTP/1.0 404 File Not Found" + CRLF;
- contentTypeLine = "Content-Type: text/html" + CRLF;
- entityBody = "" +
- "
Not Found " + - "
File name:
"+fileName+ - "404 Not Found";
- }
- // 将上述返回值依次输出
- os.writeBytes(statusLine);
- os.writeBytes(contentTypeLine);
- os.writeBytes(CRLF);
- System.out.println("\n*************Response**************\n");
- System.out.println(statusLine);
- if (fileExists) {
- sendBytes(fis, os);
- fis.close();
- }
- else {
- os.writeBytes(entityBody) ;
- }
- // 结束关闭
- os.close();
- br.close();
- socket.close();
- }
- private static void sendBytes(FileInputStream fis, OutputStream os) throws Exception {
- byte[] buffer = new byte[1024];
- int bytes = 0;
- while ((bytes = fis.read(buffer)) != -1) {
- os.write(buffer, 0, bytes);
- }
- }
- private static String contentType(String fileName) {
- if(fileName.endsWith(".htm") || fileName.endsWith(".html")) {
- return "text/html";
- }
- else return "other Content-type" ;
- }
- }
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |