计网实验四报告
- 格式:doc
- 大小:414.50 KB
- 文档页数:4
实验四、web服务器套接字编程
序号: 姓名: 学号: 成绩
1.实验目的:
编写一个WEB服务器程序,可以接受来自浏览器的访问,并传输页面(包含多个对象)到浏览器。掌握Socket编程。
2.实验环境:
连入局域网络的主机一台。
3.实验指导:
超文本传输协议(HTTP)是位于TCP/IP 协议的应用层,是最广为人知的协议,也是互连网中最核心的协议之一。HTTP协议是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。
一个完整的HTTP协议会话过程包括四个步骤:
连接
Web浏览器与Web服务器建立连接,打开一个称为Socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功;
请求
Web浏览器通过Socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递);
应答
Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面;
关闭连接
应答结束后Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。
4.实验分析,回答下列问题。
(1)运行实验提供的Webserver.java程序,分析该程序实现的功能,未实验程序主要代码加上注释,并画出程序流程图。
程序代码:
import java.io.*; //引入Java输入输出包
import .*; //引入Java网络包
import java.util.*; //导入Java实用工具库
class Webserver{
public static void main(String arg[]) throws Exception{
String request MessageLine;
String filename;
//创建一个监听socket
ServerSocket listenSocket=new ServerSocket(8080);
//等待客户机发起连接
Socket connectionSocket=listenSocket.accept();
//创建一个从socket中读文本行的流
BufferedReader inFromClient=new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
//创建一个向socket中写文本行的流
DataOutputStream outToClient=new
DataOutputStream(connectionSocket.getOutputStream());
//读取客户机发送的一行文本
requestMessageLine=inFromClient.readLine();
//字段串解析
StringTokenizer tokenizerLine=newStringTokenizer(requestMessageLine);
//如果客户端的请求方式为get方式
if(tokenizerLine.nextToken().equals("GET")){
filename=tokenizerLine.nextToken();
//获得文件名
if(filename.startsWith("/")==true)
filename=filename.substring(1);
//新建文件
System.out.println("The request filename is:" + filename);
//输出字符串,内容为客户端请求的文件名
File file=new File(filename);
int numOfBytes=(int)file.length();
//新建文件输入流
FileInputStream inFile=new FileInputStream(filename);
byte[] fileInBytes=new byte[numOfBytes];
//将文件流信息读入byte数组
inFile.read(fileInBytes);
// 服务端输出信息
outToClient.writeBytes("HTTP/1.0 200 Document Follows\r\n");
//不同的文件类型所对应的头文件格式不同
if(filename.endsWith(".jpg"))
outToClient.writeBytes("Content-Type:image/jpeg\r\n");
if(filename.endsWith(".gif"))
outToClient.writeBytes("Content-Type:image/gif\r\n");
outToClient.writeBytes("Content-Length:"+numOfBytes+"\r\n");
outToClient.writeBytes("\r\n");
outToClient.write(fileInBytes,0,numOfBytes);
connectionSocket.close();
}
//错误的请求方式
else System.out.println("Bad Resquest Message");
}
}
程序流程图: 开始新建一个服务器套接字对象等待用户连接读取请求报文的首行GET请求是用户请求的路径是否以’/’开始去掉开头的"/"是保存文件的大小否保存文件内容写入响应报文首行请求文件是不是jpg文件在响应报文中写入文件的类型为 jpeg请求文件是不是gif文件在响应报文中写入文件的类型为 gif是否在响应报文中写入文件的大小否是在响应报文中写入’\r\n’向客户端传送文件关闭连接输出"Bad
Resquest
Message"否结束 (2)此程序运行后,每次只能访问一个网页对象,请修改完善程序,使Webserver.java程序能够将所有网页对象都返回给浏览器。提示:可参考使用while(true){ }结构,选定合适的循环体来实现。
注意事项:使用WEB浏览器来测试WEB服务器的程序,如果在本机上测试,本机服务器监听端口为6789,要获得本机上文件名为index.html,应在浏览器指定下列URL
http://localhost:6789/index.html;如果服务器程序不在本机上,服务器监听端口为6789,要获得服务器上文件名为index.html,应在浏览器指定下列URL http://服务器IP地址:6789/index.html
四、实验总结
总结你在实验过程中遇到的问题和解决的方法。
1、运行程序后发现,在浏览器输入地址后还是无法显示;原因在于下载的网页没有与服务器程序放在同一个文件夹里面;
2、运行程序还是无法显示结果;原因在于监听端口号与浏览器输入的端口号不一致;
3、在阅读程序中,对大部分代码不是很理解,经过查阅相关的JAVA程序设计书籍以及socket编程相关资料而基本上理解的本段代码的基本意思和功能。