计算机网路实验二 多线程Web服务器的设计与实现

一、 实验目的及任务
1、实验目的
熟悉简单网络的搭建与基本配置;
熟悉socket、多线程编程;
熟悉JDK编程工具的基本使用;
熟悉HTTP协议;
熟悉Web服务器的基本工作原理和配置。
2、实验任务
(1)以JDK为开发工具,利用Socket通信机制实现一个多线程的WEB服务器,该服务器具有以下功能:
 能够并行服务于多个请求。
 对于每个请求,显示接收到的HTTP请求报文的内容,并产生适当的响应(若找到用户请求对象,则返回该对象。否则发送一个包含适当提示信息的响应消息,从而可以在浏览器窗口中显示差错信息。)
(2)搭建一个简单的网络环境,调试 web服务器程序。
二、实验性质
设计性实验
三、 实验环境
操作系统:Windows2000 server
开发工具:JDK或其他开发工具
实验设备:交换机(一台)、计算机(两台)、网线若干

四、 实验步骤
1、 开发程序
2、 搭建简单的C/S网络
3、 配置并测试web服务器程序
五、 实验内容
1.Web服务器程序的结构框图如下:

2.实验源代码如下:

MultiTHreadWebServer.javapackage networktwo;import java.net.* ;
//创建监听端口等待TCP连接请求
public final class MultiThreadWebServer {public static void main(String argv[]) throws Exception {//创建Web服务器的监听端口(套接字)ServerSocket socket = new ServerSocket(8900);while (true) {// Listen for a TCP connection request.Socket connection = socket.accept();//创建httprequest对象,将标志着所建立TCP连接的Socket作为参数传递到它的构造函数中HttpRequest request = new HttpRequest(connection);//创建一个Thread对象,将HttpRequest对象作为参数传递给Thread的构造函数Thread thread = new Thread(request);//启动线程thread.start();}}
}HttpRequest.java
package networktwo;import java.io.* ;
import java.net.* ;
import java.util.* ;final class HttpRequest implements Runnable {//用”回车换行”作为Response消息头部行的结束final static String CRLF = "\r\n";Socket socket;//将参数socket即Socket connection赋给当前对象的(this)成员变量socket即this.socketpublic HttpRequest(Socket socket) throws Exception {this.socket=socket;}    public void run() {try {//调用实现Request消息处理绝大部分操作的方法processRequest();} catch (Exception e) {System.out.println(e);}}//实现Request消息处理private void processRequest() throws Exception {InputStreamReader is=new InputStreamReader(socket.getInputStream());DataOutputStream os=new  DataOutputStream(socket.getOutputStream());BufferedReader br = new BufferedReader(is);//往缓冲区读取(缓存)String  requestLine;//从输入流中读取字符,直到遇到CRLF为止requestLine=br.readLine();System.out.println(requestLine);//设置循环操作来获取Request消息的所有头部行String headerLine = null;while ((headerLine = br.readLine()).length() != 0) {System.out.println(headerLine);}//Openfile,获取文件信息StringTokenizer tokens = new StringTokenizer(requestLine);tokens.nextToken();  //跳过请求方法String fileName = tokens.nextToken();//获取路径fileName="."+fileName;FileInputStream fis = null ;boolean fileExists = true ;try {fis = new FileInputStream(fileName);} catch (FileNotFoundException e) {fileExists = false ;}// 分析客户Request消息的代码,并发送Response消息String statusLine = null;        //状态行String contentTypeLine = null;   //Content-Type行String entityBody = null;        //Entity body部分//请求文件存在生成头部行Content-type
if (fileExists) {statusLine="HTTP/1.1 200 OK"+CRLF; //指示返回内容的类型contentTypeLine = "Content-type: " + contentType( fileName ) + CRLF;} else {  //请求文件不存在生成状态行、头部行以及实体的主体,使用CRLF进行间隔statusLine="HTTP/1.1 404 NotFound"+CRLF;contentTypeLine = "Content-type: text/html"+CRLF;entityBody ="<html><title>Not found</title><h1>404 NotFound</h1></html>";}os.writeBytes(statusLine);os.writeBytes(contentTypeLine);os.writeBytes(CRLF);//如果文件存在调用另一个方法发送文件,不存在则向客户发送一个HTML编码的错误信息if (fileExists) {sendBytes(fis, os);fis.close();} else {os.writeBytes(entityBody);}//关闭输入/出流和connection socket。 System.out.println();os.close();br.close();socket.close();}private static void sendBytes(FileInputStream fis,OutputStream os) throws Exception {byte[] buffer = new byte[1024];//1KBint 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")|| fileName.endsWith(".txt")) {return "text/html";}if(fileName.endsWith(".jpg")) {return "image/jpeg";}if(fileName.endsWith(".gif")) {return "image/gif";}return "application/octet-stream";}
}

服务器的运行结果如下:
访问存在的文本文档:

访问已存在的图片文件如下:

访问不存在的文件:

计算机网路实验二 多线程Web服务器的设计与实现相关推荐

  1. 利用python编写设计多线程web服务器(计算机网络_自顶向下第六版_第二章1和4的编程作业)

    今天翻看自己以前的博客时,发现了这则博客,距今大约也有一年多的时间了,觉得还是蛮有趣的一个作业,于是跟着博客又做了一遍,觉得之前的排版有点不大好,所以此番用markdown 稍微重做些修改更新一下博客 ...

  2. 【CentOS Linux 7】实验6【web服务器搭建与管理】

    Linux系统及应用---调研报告 [Linux CentOS 7]实验1[VMware安装.新建虚拟机:63个基础命令运行结果图] [Linux CentOS 7]实验2[Shell编程及应用] [ ...

  3. java使用socket实现一个多线程web服务器

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用socket实现一个多线程web服务器 除了服务器类,还包括请求类和响应类 请求类:获取客户的HTTP请求,分析客户所需要的文件 响应 ...

  4. 计算机组成原理中FZ,计算机组成原理实验二.doc

    计算机组成原理实验二.doc 北京科技大学 计算机与通信工程学院 实 验 报 告 实验名称:?? 基本运算器实验 李奥林 ???? 专 业:??? 计算机科学与技 ? ? 班 级:??? 计1303? ...

  5. 计算机图形学实验二 《绘制任意斜率的直线》

    计算机图形学实验二 <绘制任意斜率的直线> 视频讲解地址 一.Bresenham算法 用视频讲会好点我之前也录过相关视频可以先凑合看 二.设计CLine类 之前也说了C++一个类是由源文件 ...

  6. 基于JAVA服务器监控系统设计,远程数字图像监控系统中web服务器的设计与实现...

    摘要: 数字图像监控系统在目前处于小规模发展阶段,系统的核心是监控服务器.在一些小规模的应用中,监控服务器同时还充当着监控终端的角色.但是,大部分监控系统都没有考虑用户权限.安全性.收费模式等方面的问 ...

  7. 计算机控制实验PID数字控制器设计,实验二数字PID控制器的设计

    <实验二数字PID控制器的设计>由会员分享,可在线阅读,更多相关<实验二数字PID控制器的设计(13页珍藏版)>请在人人文库网上搜索. 1.实验二 数字PID控制器的设计直流闭 ...

  8. 模型机设计计算机组成原理报告,计算机组成原理 实验报告四 基本模型机设计与实现...

    计算机组成原理 实验报告四 基本模型机设计与实现 计算机组成原理实验报告学院:计算机科学与信息 专业: 班级:姓名 学号 实验组实验时间 指导教师 成绩实验项目名称 实验四.基本模型机设计与实现实验目 ...

  9. 为网站配置web服务器实验报告,配置web服务器实验报告.docx

    文档介绍: 配置web服务器实验报告实验报告专业班级成绩评定_______学号姓名教师签名_______实验题目配置和管理Web服务器实验时间一.实验目的: 1.掌握Web服务器的基本配置方法.2.学 ...

最新文章

  1. python车辆路径优化_车辆路径问题中距离维的设置
  2. (四)协同过滤算法之基于用户的推荐算法python实现
  3. (二)stm32之中断配置
  4. linux急救模式_抢救Linux! Windows XP支持今天终止
  5. 创建一个Hello World的Confluence宏
  6. jmeter简单实践(九)
  7. 计算机网络谢希仁第八版 课后答案第七版课后答案
  8. SVNServer中的权限问题
  9. Java 移位操作符
  10. 从零开始实现一个颜色选择器(原生JavaScript实现)
  11. 小呆聚合支付系统免签约即时到账多商户支付系统v6.5+监控软件+教程
  12. NAS与文件系统服务器比较,磁盘阵列与NAS服务器的比较
  13. 二元一次方程组计算机题,2元一次方程组(二元一次方程组计算题带答案)
  14. Python 小白学习之:linux 基础和 python 入门
  15. mac 设置java环境变量_mac下java环境变量配置
  16. oracle not turn on,how to turn on the tracing ?
  17. Python-jQuery
  18. 词频统计(仍需完善版)
  19. Python + Selenium实现web端的UI自动化
  20. spring IOC DI AOP

热门文章

  1. 实用新型专利和发明专利区别如何区分实用新型专利和发明专利
  2. 如何保证云docker容器重启后数据不丢失
  3. java eclipse 简单的局域网聊天 webservice
  4. 大班科学计算机的发明应用教案,大班教案时钟的发明_大班科学教案:时钟的秘密...
  5. SouthernBiotech Annexin V染色方案
  6. listview连接mysql_ListView 数据库 C
  7. MFC CPropertySheet控件
  8. Reader entry: �����乱码问题
  9. Sublime Text 编辑器 安装插件 / 快捷键介绍
  10. IOS 自动化探索——使用蓝牙实现 XCUITest 的 Tap 操作