4北交-计算机网络-13281069-谢洁-用JAVA-实现WEB-服务器Word文档下载推荐.docx
《4北交-计算机网络-13281069-谢洁-用JAVA-实现WEB-服务器Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《4北交-计算机网络-13281069-谢洁-用JAVA-实现WEB-服务器Word文档下载推荐.docx(7页珍藏版)》请在冰点文库上搜索。
Web浏览器提交请求后,通过HTTP协议传送给Web服务器。
Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。
关闭连接:
当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。
3.Java实现Web服务器功能的程序设计
根据上述HTTP协议的作用原理,实现GET请求的web服务器程序方法如下:
(1)创建ServerSocket类对象,监听端口8080
(2)等待、接受客户机连接到端口8080,得到与客户机连接的socket
(3)创建与socket字相关联的输入流instream和输出流outstream
(4)从与socket关联的输入流instream中读取一行客户机提交的请求信息,请求信息的格式为:
GET路径/文件名HTTP/1.0
(5)从请求信息中获取请求类型。
如果请求类型是GET,则从请求信息中获取所访问的
HTML文件名。
没有HTML文件名时,则以index.html作为文件名
(6)如果HTML文件存在,则打开HTML文件,把HTTP头信息和HTML文件内容通过socket
传回给Web浏览器,然后关闭文件。
否则发送错误信息给Web浏览器
(7)关闭与相应Web浏览器连接的socket字
4.测试结果与分析
(1)编写两个html文件index.html和next.html,其内容如下:
index.html文件:
<
html>
head>
TITLE>
JavaWeb服务器<
/TITLE>
h1>
Windows环境下用java实现Web服务器实验<
/h1>
/head>
body>
h2>
这是第<
fontcolor="
red"
>
一<
/font>
个页面<
/h2>
ahref="
http:
//localhost:
8080/f:
/web/next.html"
跳转到第二个页面<
/a>
/body>
/html>
next.html文件:
二<
/web/index.html"
跳转到第一个页面<
将这两个html文件放在主机上的目录F:
\web中。
(2)在eclipse中运行上面的WebServer.java文件,服务器开始运行,监听端口8080
(3)打开浏览器,在地址栏中输入字符http:
/web/index.html然后回车,可以在浏览器中看到所制作的网页,并且程序的输出可以体现出HTTP协议的运作的四个过程:
建立连接之后,服务器获取客户机提交的请求信息,并从请求信息中获取所访问的HTML文件名,把HTTP头信息和HTML文件内容通过socket传回给Web浏览器,最后关闭连接。
(4)点击页面中的“跳转到第二个页面”的链接,在浏览器中可以看到制作的另一张网页。
此时又重新建立了一个连接,进行信息的发送与响应。
(5)输入错误的网址时,无法打开页面
5.实验总结
通过本次实验,加深了我对基于HTTP协议的客户/服务器模式的信息交换分四个过程:
建立连接、发送请求信息、发送响应信息、关闭连接以及WEB服务器的实现原理的理解。
本次实验中遇到的主要问题为向服务器发送的请求信息中的文件路径出错,导致网页打不开,由于访问的端口为8080端口,所以在浏览器地址栏里面输入的应该是http:
8080/+文件路径,并且在html文件中的链接也要保证路径的正确性,才能实现页面间的跳转。
6.程序代码
WebServer.java文件:
//服务器主要负责初始化套接字和线程,代码如下:
import.ServerSocket;
import.Socket;
publicclassWebServer{
publicstaticvoidmain(String[]args){
intPort=8080;
//端口号,由于这里是测试,所以不要使用常用端口
//创建两个套接字ServerSocketserver=null;
Socketclient=null;
try{
server=newServerSocket(Port);
//服务器开始监听
System.out.println("
服务器正在监听端口:
"
+server.getLocalPort());
while(true){
client=server.accept();
//接收客户机的链接请求
建立连接"
);
//System.out.println(client);
//多线程运行
newCommunicateThread(client).start();
}
}catch(Exceptione){System.out.println(e.getMessage());
CommunicateThread.java文件:
程序中的ConnectionThread线程子类用来分析一个Web浏览器提交的请求,并将应答信息传回给Web浏览器
//web服务器获取一个用户的连接时,会初始化一个线程和用户通信,代码如下:
importjava.io.*;
import.Socket;
//创建一个通信线程
publicclassCommunicateThreadextendsThread{Socketclient;
//与客户端通信的套接字publicCommunicateThread(Sockets){
client=s;
//获取浏览器请求资源的路径
publicStringgetResourcePath(Strings){
//HTTP请求报文第一行GET/index.htmlHTTP/1.1”,获取的就是中间的"
/index.apsx"
//获取资源的位置
Strings1=s.substring(s.indexOf('
'
)+1);
s1=s1.substring(1,s1.indexOf('
));
//默认资源为index.html
if(s1.equals("
))
s1="
index.html"
;
returns1;
publicvoidsendFile(PrintStreamout,Filefile){
DataInputStreamin =newDataInputStream(newFileInputStream(file));
intlen=(int)file.length();
bytebuf[]=newbyte[len];
in.readFully(buf);
//读取文内容到buf数组中out.write(buf,0,len);
out.flush();
in.close();
catch(Exceptione){System.out.println(e.getMessage());
System.exit
(1);
publicvoidrun(){
//获取用户的IP地址和端口号
StringclientIP=client.getInetAddress().toString();
intclientPort=client.getPort();
//创建输出流对象
PrintStreamout=newPrintStream(client.getOutputStream());
//创建输入流对象
BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));
//读取浏览器提交的请求Stringmsg=in.readLine();
客户机提交的请求信息:
+msg);
//获取文件路径
StringfileName=getResourcePath(msg);
获取html文件:
"
+fileName);
Filefile=newFile(fileName);
if(file.exists()){
//根据响应报文格式设置
System.out.println(fileName+"
开始发送"
out.println("
HTTP/1.0200OK"
MIME_version:
1.0"
Content_Type:
text/html"
intlen=(int)file.length();
Content_Length:
+len);
out.println("
//报文头和信息之间要空一行
//发送文件sendFile(out,file);
out.flush();
关闭连接"
client.close();