您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 北交计算机网络13281069_谢洁_用JAVA实现WEB服务器
用JAVA实现WEB服务器1.训练目的(1)处理一个http请求(2)接收并解析http请求(3)从服务器文件系统中获得被请求的文件(4)创建一个包括被请求的文件的http响应信息(5)直接发送该信息到客户端通过本实验,能够进一步理解HTTP协议的技术细节以及WEB服务器的实现原理。2.HTTP协议的作用原理基于HTTP协议的客户/服务器模式的信息交换分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。连接:连接的建立是通过申请套接字(Socket)实现的。客户打开一个套接字并把它约束在一个端口上,如果成功,就相当于建立了一个虚拟文件。以后就可以在该虚拟文件上写数据并通过网络向外传送。请求:Web浏览器通过该socket向Web服务器提交请求。响应: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文件:htmlheadTITLEJavaWeb服务器/TITLEh1Windows环境下用java实现Web服务器实验/h1/headbodyh2这是第fontcolor=red一/font个页面/h2ahref=:/web/next.html跳转到第二个页面/a/body/htmlnext.html文件:htmlheadTITLEJavaWeb服务器/TITLEh1Windows环境下用java实现Web服务器实验/h1/headbodyh2这是第fontcolor=red二/font个页面/h2ahref=:/web/index.html跳转到第一个页面/a/body/html将这两个html文件放在主机上的目录F:\web中。(2)在eclipse中运行上面的WebServer.java文件,服务器开始运行,监听端口8080(3)打开浏览器,在地址栏中输入字符:/web/index.html然后回车,可以在浏览器中看到所制作的网页,并且程序的输出可以体现出HTTP协议的运作的四个过程:建立连接、发送请求信息、发送响应信息、关闭连接。建立连接之后,服务器获取客户机提交的请求信息,并从请求信息中获取所访问的HTML文件名,把HTTP头信息和HTML文件内容通过socket传回给Web浏览器,最后关闭连接。(4)点击页面中的“跳转到第二个页面”的链接,在浏览器中可以看到制作的另一张网页。此时又重新建立了一个连接,进行信息的发送与响应。(5)输入错误的网址时,无法打开页面5.实验总结通过本次实验,加深了我对基于HTTP协议的客户/服务器模式的信息交换分四个过程:建立连接、发送请求信息、发送响应信息、关闭连接以及WEB服务器的实现原理的理解。本次实验中遇到的主要问题为向服务器发送的请求信息中的文件路径出错,导致网页打不开,由于访问的端口为8080端口,所以在浏览器地址栏里面输入的应该是文件路径,并且在html文件中的链接也要保证路径的正确性,才能实现页面间的跳转。6.程序代码WebServer.java文件://服务器主要负责初始化套接字和线程,代码如下:importjava.net.ServerSocket;importjava.net.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(建立连接);//System.out.println(client);//多线程运行newCommunicateThread(client).start();}}catch(Exceptione){System.out.println(e.getMessage());}}}CommunicateThread.java文件:程序中的ConnectionThread线程子类用来分析一个Web浏览器提交的请求,并将应答信息传回给Web浏览器//web服务器获取一个用户的连接时,会初始化一个线程和用户通信,代码如下:importjava.io.*;importjava.net.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.htmlif(s1.equals())s1=index.html;returns1;}publicvoidsendFile(PrintStreamout,Filefile){try{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(){try{//获取用户的IP地址和端口号StringclientIP=client.getInetAddress().toString();intclientPort=client.getPort();//创建输出流对象PrintStreamout=newPrintStream(client.getOutputStream());//创建输入流对象BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));//读取浏览器提交的请求Stringmsg=in.readLine();System.out.println(客户机提交的请求信息:+msg);//获取文件路径StringfileName=getResourcePath(msg);System.out.println(获取html文件:+fileName);Filefile=newFile(fileName);if(file.exists()){//根据响应报文格式设置System.out.println(fileName+开始发送);out.println(HTTP/1.0200OK);out.println(MIME_version:1.0);out.println(Content_Type:text/html);intlen=(int)file.length();out.println(Content_Length:+len);out.println();//报文头和信息之间要空一行//发送文件sendFile(out,file);out.flush();}System.out.println(关闭连接);client.close();}catch(Exceptione){System.out.println(e.getMessage());}}}
本文标题:北交计算机网络13281069_谢洁_用JAVA实现WEB服务器
链接地址:https://www.777doc.com/doc-2621521 .html