计算机网络实验报告(一)——Windows环境下用java实现web服务器(一)实验目的:通过本实验进一步理解HTTP协议的技术细节以及WEB服务器的实现原理并了解java提供的支持TCP协议的借口和类的使用。(二)实验内容:(1)处理一个http请求(2)接收并解析http请求(3)从服务器文件系统中获得被请求的文件(4)创建一个包括被请求的文件的http响应信息(5)直接发送该信息到客户端(三)实验原理:HTTP协议的作用原理:作为传输媒介的一个应用系统,网页。的工作基于客户机/服务器计算模型,由Web浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信。HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层协议,是通用的、无状态的、面向对象的协议。HTTP协议的作用原理包括四个步骤:(1)连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。(2)请求:Web浏览器通过socket向Web服务器提交请求。HTTP的请求一般是GET或POST命令(POST用于FORM参数的传递)。GET命令的格式为:GET路径/文件名HTTP/1.0文件名指出所访问的文件,HTTP/1.0指出Web浏览器使用的HTTP版本。(3)应答:Web浏览器提交请求后,通过HTTP协议传送给Web服务器。Web服务器接到后,进行事务处理,处理结果又通过HTTP传回给Web浏览器,从而在Web浏览器上显示出所请求的页面。原理示意图如下:(四)实验步骤:考虑利用java提供给TCP的端口和系统定义类进行传输实现,大致分为以下几步:(1)创建ServerSocket类对象,监听端口7977。这是为了区别于HTTP的标准TCP/IP端口80而取的;(2)等待、接受客户机连接到端口7977,得到与客户机连接的socket;(3)创建与socket字相关联的输入流instream和输出流outstream;(4)从与socket关联的输入流instream中读取一行客户机提交的请求信息,请求信息的格式为:GET路径/文件名HTTP/1.0(5)从请求信息中获取请求类型。如果请求类型是GET,则从请求信息中获取所访问的HTML文件名index.html。(6)如果HTML文件存在,则打开HTML文件,把HTTP头信息和HTML文件内容通过socket传回给Web浏览器,然后关闭文件。否则发送错误信息给Web浏览器;(7)关闭与相应Web浏览器连接的socket字。(五)实验结果:在IE浏览器中输入网址:,consolewindows输出如下:浏览器显示页面如下:(六)问题总结:1.初始阶段我是根据课本上给出的程序源码进行编写调试的,发现在命令行测试ping对方ip显示连接成功,但作为客户端的主机无法正常加载存储在服务器主机的网页;经过仔细与正确运行代码的比对,我发现我给出的代码没有进行请求信息的提取和解析,所以没办法正常得到网页,由此,我得到的经验是不能单一依靠课本给出的参考代码,要自己仔细琢磨协议的流程和要求,掌握每一个步骤,才能准确地掌握实验内容,达到实验目的2.要注意端口号的选择,我在调试程序过中屡次遇到报错端口已被占用的情况,于是我百度这种情况的解决方案,明白了端口号一般1024以前大多是一些已经占用的端口,用户定义时一般考虑1024-9999端口,若仍不确定,可在命令行敲入telnet查看当前占用的端口号,避开这些端口号,基本就可以避免这种报错。(七)附录:java源代码://WebServer.classimportjava.io.*;importjava.net.*;publicclassWebServer{publicstaticvoidmain(String[]args){while(true){try{ServerSocketwelcomeSocket=newServerSocket(7977);//端口号7977,开启服务器socketSystem.out.println(服务器成功启动,等待连接…….);Socketsocket=welcomeSocket.accept();//等待服务器连接System.out.println(连接成功);InputStreaminputStream=socket.getInputStream();//得到并解析requestBufferedReaderinFromClient=newBufferedReader(newInputStreamReader(inputStream));Stringline=inFromClient.readLine();System.out.println(line);Stringurl=line.substring(5,line.indexOf(HTTP)-1);inputStream=newFileInputStream(C:/+url);OutputStreamoutputStream=socket.getOutputStream();byte[]buffer=newbyte[4*1024];intlen=0;while((len=inputStream.read(buffer))!=-1){outputStream.write(buffer,0,len);}outputStream.flush();System.out.println(网页传输成功);welcomeSocket.close();//关闭相应资源socket.shutdownInput();socket.close();inputStream.close();inFromClient.close();outputStream.close();}catch(Exceptione){}}}}