实验9 利用Java开发网络应用程序.docx
- 文档编号:3706173
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:23
- 大小:454.59KB
实验9 利用Java开发网络应用程序.docx
《实验9 利用Java开发网络应用程序.docx》由会员分享,可在线阅读,更多相关《实验9 利用Java开发网络应用程序.docx(23页珍藏版)》请在冰豆网上搜索。
实验9利用Java开发网络应用程序
实验9:
利用Java开发网络应用程序
1.实验目的
1)基本掌握利用Java开发环境调试应用程序的方法。
2)理解基于套接字开发网络应用程序的过程,深入理解Ping工作原理。
3)深入理解HTTP协议的格式和工作过程,理解Web代理服务器工作原理。
2.实验环境
1)运行Windows2008Server/WindowsXP/Windows7操作系统的PC2台。
2)每台PC具有以太网卡一块,通过双绞线与局域网相连。
3)具有Java开发包jdk-1_5_0_06-windows-i586-p.exe。
3.实验步骤
1)安装Java编程环境
(1)安装开发包JDK。
双击JDK安装程序jdk-1_5_0_06-windows-i586-p.exe图标,进行安装。
根据安装提示选择安装目录后开始安装过程。
在安装JDK的过程中,同时需要安装Java运行环境JRE(JavaRuntimeEnvironment)。
接下来。
配置Java环境变量。
右键点击“我的电脑”,选择“属性”。
然后选择“高级”选项卡,点击“环境变量”,即弹出如图45所示的界面。
图45环境变量配置界面
(2)修改环境变量的值。
在“用户变量”中,分别设置JAVA_HOME、PATH和CLASSPATH这3项属性。
若已存在则点击“编辑”,不存在则点击“新建”。
JAVA_HOME指明JDK的安装路径,也就是在安装时选择的路径,如D:
\Java\jdk1.5.0_06,在此路径下包括lib、bin、jre等文件夹。
PATH使得系统可以在任何路径下识别Java命令,该值设为“%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”。
CLASSPATH为Java加载类路径,只有类在classpath中,Java命令才能识别,该值设为“.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar”。
测试安装结果。
选择“开始”菜单中的“运行”,键入“cmd”。
在命令提示符中键入“java–version”、“java”和“javac”命令,出现如图46所示画面则说明环境变量配置成功。
图46运行Java命令结果
(3)在命令提示符环境编译运行java程序。
Java程序编写后,就可以在命令提示符环境下编译和运行。
启动命令提示符后,先利用“cd”命令进入Java程序所在的目录,然后键入“javacjava类的文件名”命令编译该Java程序。
如果编译成功,则不会显示错误信息并直接返回。
此后,在该目录下会产生一个.class文件。
直接键入“javajava类名运行参数”即可运行该编译好的Java程序。
如果想要退出正在运行的Java程序,按“ctrl+C”即可完成。
2)在Java集成开发环境下调试程序
前面假定编写的Java程序是正确的,而事实上自己首次编写的程序通常都会出现这样或那样的问题。
为此,需要借助于Java集成开发环境来调试程序。
(1)安装Java集成开发环境。
Java的集成开发环境有很多,对于IBM公司开发的开源Java集成开发环境eclipse,在解压eclipse压缩包后,双击eclipse.exe即可运行eclipse。
图49是eclipse运行后的主界面。
图49eclipse集成开发环境主界面
(2)在eclipse中创建、编译和运行java程序。
首先要创建java程序。
运行eclipse后,从菜单栏选择“File->New->Project…”,接着会弹出如图50所示的对话框。
图50eclipse新建项目向导
在下拉框中选中“JavaProject”,点击下方的“Next”按钮,弹出“NewJavaProject”向导,在“Projectname”中输入如“Example”,点击“Finish”按钮关闭对话框,这样一个java项目就建立完毕了,同时在eclipse的左侧会出现新建好的名为“Example”的java项目。
接下来右键点击“Example”项目,选择“New->class”,弹出如图51所示的新建类java对话框。
图51eclipse新建类向导
在“Name”中输入需要新建的类的名字,点击下方的“Finish”按钮即可创建一个新的java类。
然后再编译和运行java程序。
在eclipse右侧的程序编辑框中编写完java程序后,点击菜单栏中的“保存”,eclipse会自动对代码进行编译并生成类文件。
在编译完java代码后,即可运行写好的类,右键选择需要运行的java类,选择“RunAs->Run…”。
选择“Arguments”选项卡,在“Programarguments”中输入程序运行参数,然后点击下方的“Run”按钮,即可运行该java程序。
3)编写UDPPing程序
要采用UDP协议来实现ICMP协议中Ping报文的功能,就必须在应用层来模拟网络层中Ping报文的工作流程,即首先由客户机向服务器端发送一个应用层的UDPPing请求报文,服务器端程序在接收到UDPPing请求报文后,向客户机返回一个UDPPing响应报文,客户机通过判断是否能够接收到该响应报文以及相应的丢包率、时延大小等信息来分析客户机与服务器端之间的链路状况。
因此需要利用UDP套接字实现服务器和客户机程序,在应用层模拟Ping报文的通信过程。
图54显示了服务器和客户机之间的交互过程。
图54服务器和客户机交互过程
(1)编写服务器端程序。
服务器端程序主要实现的功能包括:
根据用户输入参数打开特定的插口,并对插口进行监听,接收从客户机发送过来的应用层Ping请求报文,打印该应用层数据内容,然后向客户机回复Ping响应报文。
请学员阅读代码并回答下列问题:
1)代码第16行为什么要加上port参数?
不加该参数会出现什么情况?
16行的Port参数用于标识进程,因为UDP是进程到进程之间的通信,如果没有,则无法识别报文的目的是否自己。
2)哪一行代码是用于接收客户机发送过来的Ping请求报文?
19行用于接收客户机发送过来的ping报文。
3)代码第21至24行是模拟网络中的什么现象?
21~24模拟了网络丢包现象。
4)代码第25行又是模拟网络中的什么现象?
25行模拟了网络出现时延。
5)代码第26和27行所获取的参数分别代表什么意思?
不提取该参数行不行?
为什么?
26、27行获取客户机进程的地址和端口,如果不提取参数,就无法发送报文到客户机进程。
6)服务器端向客户机回复的Ping响应报文应用层数据是什么?
服务器端向客户机回复的Ping响应报文应用层数据是客户机发过来的ping报文数据。
1importjava.io.*;
2import.*;
3importjava.util.*;
4/*利用UDP协议实现ping报文请求的服务器端程序*/
5publicclassPingServer{
6privatestaticfinaldoubleLOSS_RATE=0.3;
7privatestaticfinalintAVERAGE_DELAY=100;
8publicstaticvoidmain(String[]args)throwsException
9{
10if(args.length!
=1){
11System.out.println("Requiredarguments:
port");
12return;
13}
14intport=Integer.parseInt(args[0]);
15Randomrandom=newRandom();
16DatagramSocketsocket=newDatagramSocket(port);
17while(true){
18DatagramPacketrequest=newDatagramPacket(newbyte[1024],1024);
19socket.receive(request);
20printData(request);
21if(random.nextDouble() 22System.out.println("Replynotsent."); 23continue; 24} 25Thread.sleep((int)(random.nextDouble()*2*AVERAGE_DELAY)); 26InetAddressclientHost=request.getAddress(); 27intclientPort=request.getPort(); 28byte[]buf=request.getData(); 29DatagramPacketreply=newDatagramPacket(buf,buf.length,clientHost,clientPort);30socket.send(reply); 31System.out.println("Replysent."); 32} 33} 34/*将ping报文的数据按照标准输出流打印出来*/ 35privatestaticvoidprintData(DatagramPacketrequest)throwsException 36{ 37byte[]buf=request.getData(); 38ByteArrayInputStreambais=newByteArrayInputStream(buf); 39InputStreamReaderisr=newInputStreamReader(bais); 40BufferedReaderbr=newBufferedReader(isr); 41Stringline=br.readLine(); 42System.out.println("Receivedfrom"+request.getAddress().getHostAddress()+": "+new String(line)); 43} 44} (2)编写客户机程序 客户机程序需要主要实现的功能包括: 与服务器建立连接,然后构建UDPPing请求报文,并将其发送给服务器,同时等待和接收从服务器发回的响应报文,连续发送10次Ping请求报文后关闭插口。 准备显示了完成上述功能的服务器端代码,请学员阅读代码并回答下列问题: 1)用户输入参数应当有多少个? 这些参数的所代表的意义是什么? 用户输入的参数要有服务器进程地址和端口。 2)客户机插口设置的超时时间是多少? 为什么要设置超时时间? 超时时间为1s,用于模拟出现丢包或时延时采取动作。 3)客户机向服务器发送的Ping请求报文应用层数据格式是什么? 数据格式为PING+i+""+timeStamp+""+"\r\n",其中i为当前报文序号,timeStamp为日期和时间。 4)代码第30行中四个参数的意义分别是什么? 发送报文用到的4个参数为数据、数据长度、服务器进程的地址和端口。 5)代码第32、36和37行是为了完成什么功能? 32、36、37行用于得到往返时延。 6)哪行代码是用于接收服务器发送过来的Ping响应报文? 35行用于接收服务器发送过来的ping报文。 1import.DatagramPacket; 2import.DatagramSocket; 3import.InetAddress; 4importjava.text.SimpleDateFormat; 5importjava.util.Date; 6publicclassPingClient{ 7publicstaticvoidmain(String[]args)throwsException{ 8if(args.length==0){ 9System.out.println("Requiredarguments: hostport"); 10return; 11} 12if(args.length==1){ 13System.out.println("Requiredarguments: port"); 14return; 15} 16Stringhost=args[0].toString(); 17intport=Integer.parseInt(args[1]); 18DatagramSocketclientSocket=newDatagramSocket(); 19clientSocket.setSoTimeout(1000); 20InetAddressIPAddress=InetAddress.getByName(host); 21longsendTime,receiveTime; 22for(inti=0;i<10;i++){ 23byte[]sendData=newbyte[1024]; 24byte[]receiveData=newbyte[1024]; 25DatecurrentTime=newDate(); 26SimpleDateFormatformatter=newSimpleDateFormat("yyyy-MM-ddHH: mm: ss");27StringtimeStamp=formatter.format(currentTime); 28StringpingMessage="PING"+i+""+timeStamp+""+"\r\n"; 29sendData=pingMessage.getBytes(); 30DatagramPacketsendPacket=newDatagramPacket(sendData,sendData.length, IPAddress,port); 31try{ 32sendTime=System.currentTimeMillis(); 33clientSocket.send(sendPacket); 34DatagramPacketreceivePacket=newDatagramPacket(receiveData, receiveData.length); 35clientSocket.receive(receivePacket); 36receiveTime=System.currentTimeMillis(); 37longlatency=receiveTime-sendTime; 38StringserverAddress=receivePacket.getAddress().getHostAddress();39System.out.println("From"+serverAddress+": "+latency+"ms.");40}catch(.SocketTimeoutExceptionex){ 41Stringreply="Noreply."; 42System.out.println(reply); 43} 44} 45clientSocket.close(); 46} 47} (3)编译和运行UDPPing程序。 在完成UDPPing服务器端程序PingServer.java以及客户机程序PingClient.java的编写后,可以在Java集成环境下或在命令提示符下对这两个java文件进行编译。 如在命令提示符下,编译时首先利用“cd”命令进入这两个文件所在的目录,然后键入命令: javacPingServer.java以及javacPingClient.java。 如果编译成功,则在该目录下会产生两个新的文件,分别为PingServer.class和PingClient.class。 先运行服务器端程序,运行的命令为: javaPingServerport。 其中port为端口号,该端口号可以指定为任意小于65535以下并且未被系统占用的端口号。 运行完服务器端程序之后,程序会等待客户机发送UDPPing请求报文。 接下来运行客户机程序,运行的命令为: javaPingClienthostport。 其中host为服务器所在的主机名字或IP地址,port为服务器开放的端口号。 分析服务器和客户机程序成功运行后出现的结果,是否与你预期一致。 设置端口号 用IP运行程序 客户机 服务器 4)编写Web代理服务器程序(选做) Web代理服务器的主要功能是接收来自浏览器的GET报文,并向目的Web服务器转发GET报文,从目的Web服务器接收HTTP响应报文,并向浏览器转发HTTP响应报文。 该Web代理服务器不仅能够理解简单的GET请求,而且能够处理各种对象如HTML页面对象,以及各种图像对象。 整个Web代理服务器程序由3个类组成: ProxyCache: 启动Web代理服务器程序,并对客户机的代理请求进行处理。 HttpRequest: 接收从客户机发送过来的GET报文,并对其进行相应的处理。 HttpResponse: 接收从服务器发送过来的HTTP响应报文,并对其进行相应的处理。 其中,类ProxyCache分别调用类HttpRequest和类HttpResponse来对客户机以及Web服务器发送过来的请求/响应报文进行处理。 (1)编写Web服务器代理类ProxyCache.java。 ProxyCache主要实现的功能包括: 创建并打开插口,接收从客户机的连接请求,并创建HttpRequest对象,然后解析HttpRequest对象中Web服务器的IP地址和端口号信息,将其转发Web服务器,同时接收Web服务器回复的响应报文,并将其转发给客户机。 显示了完成上述功能的ProxyCache类代码,请学员阅读代码并回答下列问题: 1)用户输入参数的功能是什么? 用户输入的参数作为代理服务器程序的端口号。 2)代码第20和21行的功能是什么? 20、21行代码接收从客户机发送过来的GET报文,并送给HttpRequest类进行相应的处理。 3)代码第27行的功能是什么? 27行代码新建了一个套接字,将客户机的地址和端口绑定。 4)代码第31至34行进行的异常处理是为了解决什么异常? 31~34行代码为了解决客户机地址错误的问题。 5)代码第43和44行中,Web代理服务器分别向客户机转发了什么数据内容? 43、44行代码将客户机请求的网页的信息转发到客户机上。 6)Web代理服务器所采用的HTTP连接方式是持久连接还是非持久连接? 从哪几行代码可以看出所采用的是何种连接方式? 同时请思考采用这种连接方式有什么好处? 从64~72行可以看出这是一个持续性连接。 1import.*; 2importjava.io.*; 3publicclassProxyCache{ 4privatestaticintport; 5privatestaticServerSocketsocket; 6publicstaticvoidinit(intp){ 7port=p; 8try{ 9socket=newServerSocket(port); 10}catch(IOExceptione){ 11System.out.println("Errorcreatingsocket: "+e); 12System.exit(-1); 13} 14} 15publicstaticvoidhandle(Socketclient){ 16Socketserver=null; 17HttpRequestrequest=null; 18HttpResponseresponse=null; 19try{ 20BufferedReaderfromClient=newBufferedReader(new InputStreamReader(client.getInputStream())); 21request=newHttpRequest(fromClient); 22}catch(IOExceptione){ 23System.out.println("Errorreadingrequestfromclient: "+e); 24return; 25} 26try{ 27server=newSocket(request.getHost(),request.getPort()); 28DataOutputStreamtoServer=newDataOutputStream(server.getOutputStream());29toServer.writeBytes(request.toString()); 30System.out.println("Requestforwarded."); 31}catch(UnknownHostExceptione){ 32System.out.println("Unknownhost: "+request.getHost()); 33System.out.println(e); 34return; 35}catch(IOExceptione){ 36System.out.println("Errorwritingrequesttoserver: "+e); 37return; 38} 39try{ 40DataInputStreamfromServer=newDataInputStream(server.getInputStream());41response=newHttpResponse(fromServer); 42DataOutputStreamtoClient=newDataOutputStream(client.getOutputStream());43toClient.writeBytes(response.toString()); 44toClient.write(response.body); 45client.close(); 46server.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验9 利用Java开发网络应用程序 实验 利用 Java 开发 网络 应用程序