您现在的位置是:首页 > 技术教程 正文

计算机网络原理——实验一Windows 环境下用 java 实现web 服务器

admin 阅读: 2024-03-31
后台-插件-广告管理-内容页头部广告(手机)

一.实验目的和意义

(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 网页。

 四、代码附录

  1. /*index.html*/
  2. html>
  3. <html>
  4. <head>
  5. <TITLE>Java Web 服务器TITLE>
  6. <h1>Windows 环境下用 java 实现 Web 服务器实验-学号h1>
  7. head>
  8. <body>
  9. <h2>NETWORK HOMEWORKh2>
  10. <a href="http://localhost:8888/next.html">NEXT PAGE TESTa>
  11. <body background="images\1.jpg">body>
  12. html>
  1. /*next.html*/
  2. html>
  3. <head>
  4. <TITLE>Java Web 服务器TITLE>
  5. <h1>Windows 环境下用 java 实现 Web 服务器实验-学号h1>
  6. head>
  7. <body>
  8. <h2>This is the second pageh2>
  9. <a href="http://localhost:8888/index.html">back
  10. <body background="images\2.jpg">body>
  11. html>
  1. /*WebServer.java*/
  2. import java.io.* ;
  3. import java.net.* ;
  4. import java.util.* ;
  5. public final class WebServer {
  6. public static void main(String argv[]) throws Exception {
  7. int port=8888;
  8. // 建立一个套接字
  9. ServerSocket socket = new ServerSocket(port);
  10. while (true) {
  11. // 监听一个tcp连接的request.
  12. Socket connection = socket.accept();
  13. // 处理HTTP请求消息。
  14. HttpRequest request = new HttpRequest(connection);
  15. // 建立一个线程处理请求
  16. Thread thread = new Thread(request);
  17. thread.start();
  18. }
  19. }
  20. }
  1. /*HttpRequest.java*/
  2. import java.io.* ;
  3. import java.net.* ;
  4. import java.util.* ;
  5. final class HttpRequest implements Runnable {
  6. final static String CRLF = "\r\n";
  7. Socket socket;
  8. public HttpRequest(Socket socket) throws Exception {
  9. this.socket = socket;
  10. }
  11. public void run() {
  12. try {
  13. processRequest();
  14. }
  15. catch (Exception e) {
  16. System.out.println(e);
  17. }
  18. }
  19. private void processRequest() throws Exception {
  20. InputStream is = socket.getInputStream();
  21. DataOutputStream os = new DataOutputStream(socket.getOutputStream());
  22. BufferedReader br = new BufferedReader(new InputStreamReader(is));
  23. // 获取http的request信息
  24. String requestLine = br.readLine();
  25. // 从请求行中提取文件信息
  26. StringTokenizer tokens = new StringTokenizer(requestLine);
  27. tokens.nextToken();
  28. // GET之后为文件名
  29. String fileName = tokens.nextToken();
  30. fileName = "." + fileName ;
  31. FileInputStream fis = null ;
  32. boolean fileExists = true ;
  33. //判断文件是否查询到
  34. try {
  35. fis = new FileInputStream(fileName);
  36. }
  37. catch (FileNotFoundException e) {
  38. fileExists = false ;
  39. }
  40. //测试输出
  41. System.out.println("\n*************Request**************\n");
  42. System.out.println(requestLine);
  43. String headerLine = null;
  44. while ((headerLine = br.readLine()).length() != 0) {
  45. System.out.println(headerLine);
  46. }
  47. // 构造response信息
  48. String statusLine = null;
  49. String contentTypeLine = null;
  50. String entityBody = null;
  51. if (fileExists) {
  52. //执行成功的话返回“200 OK”
  53. statusLine = "HTTP/1.0 200 OK" + CRLF;
  54. contentTypeLine = "Content-Type: "+contentType(fileName) + CRLF;
  55. }
  56. else {
  57. //执行失败,文件未找到的时候返回“404 File Not Found”
  58. statusLine = "HTTP/1.0 404 File Not Found" + CRLF;
  59. contentTypeLine = "Content-Type: text/html" + CRLF;
  60. entityBody = "" +
  61. "Not Found" +
  62. "

    File name:

    "
    +fileName+
  63. "404 Not Found";
  64. }
  65. // 将上述返回值依次输出
  66. os.writeBytes(statusLine);
  67. os.writeBytes(contentTypeLine);
  68. os.writeBytes(CRLF);
  69. System.out.println("\n*************Response**************\n");
  70. System.out.println(statusLine);
  71. if (fileExists) {
  72. sendBytes(fis, os);
  73. fis.close();
  74. }
  75. else {
  76. os.writeBytes(entityBody) ;
  77. }
  78. // 结束关闭
  79. os.close();
  80. br.close();
  81. socket.close();
  82. }
  83. private static void sendBytes(FileInputStream fis, OutputStream os) throws Exception {
  84. byte[] buffer = new byte[1024];
  85. int bytes = 0;
  86. while ((bytes = fis.read(buffer)) != -1) {
  87. os.write(buffer, 0, bytes);
  88. }
  89. }
  90. private static String contentType(String fileName) {
  91. if(fileName.endsWith(".htm") || fileName.endsWith(".html")) {
  92. return "text/html";
  93. }
  94. else return "other Content-type" ;
  95. }
  96. }

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索