《Java 中的网络编程.ppt》由会员分享,可在线阅读,更多相关《Java 中的网络编程.ppt(32页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2023/1/131第第11章章 Java 中的网络编程中的网络编程 本章导读本章导读n URL类n 读取URL中的资源n 显示URL资源中的HTML文件n 处理超链接n InetAddress类n 套接字Socketn 使用多线程处理套接字连接n UDP数据报n 广播数据n Java远程调用2023/1/132概述概述 本 章 重 点 介 绍 4个 重 要 的 类 URL、Socket、InetAddress和DatagramSocket。网络的一些基本知识:IP(Internet Protocol)地地址址:IP地址是用于惟一标识连接到Internet的计算机的数字地址是由32位二进制数组
2、成,如202.199.28.6。没有IP地址就不能区分连在Internet上不同的计算机。域域名名:用字符形式表示连接到Internet的计算机的数字地址。如域名“”和IP“202.108.35.210”是一个主机的两种表示法。域名服务器(域名服务器(DNS):):负责将域名与IP地址的转化。URL(Uniform Resource Locator,统一资源定位符):标识了计算机上的资源。一个URL通常包含一些重要的信息,如http:/ http http 服务使用的协议(HTTP)。n 存储资源的计算机的域名地址。n hotlink.htmlhotlink.html 资源。客户服务器体系结构
3、:客户需要某些类型的信息,而服务器提供客户所需要的信息。客户需要连接到服务器上,并向服务器请求信息,服务器则向客户发送信息,两者按照协议协同工作,各得其所。2023/1/13311.1 URL类 包中的 URL类是对URL的抽象,使用URL创建对象的应用程序称为客户端程序,一个URL对象存放着一个具体的资源的引用,表明客户要访问这个URL中的资源,利用URL对象可以获取URL中的资源。一个URL对象通常包含最基本的三部分信息协议、地址、资源。URL的构造方法的构造方法 public public URL(String URL(String spec)spec)throws throws Mal
4、formedURLExceptionMalformedURLException 使用字符串初始化一个URL对象,如 try url=new URL(http:/);try url=new URL(http:/);catch(MalformedURLException e)catch(MalformedURLException e)System.out.println(Bad URL:+url);System.out.println(Bad URL:+url);该URL对象使用的协议是HTTP,即用户按照这种协议与指定的服务器通信,该URL对象包含的地址是“”,所包含的资源是默认的资源(主页)。
5、public URL(String protocol,String host,String file)throws MalformedURLExceptionpublic URL(String protocol,String host,String file)throws MalformedURLException 构造的URL对象的协议、地址和资源分别由参数protocol、host和file指定。2023/1/13411.2 读取URL中的资源 URL对象调用InputStream openStream()方方法法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服
6、务器上的资源信息读入到客户端。例11-1(效果如图11.1所示)在一个文本框中输入网址,然后单击“确定”按钮读取服务器上的资源。由于 网 络 速 度 或 其 他 因 素,URL资源的读取可能会引起堵塞,因此程序需在一个线程中读取URL资源,以免堵塞主线程。2023/1/13511.3 显示URL资源中的HTML文件 在上面的例11-1中,http:/的主页的内容显示在文本区中,但有时候我们想看到网页的运行效果。javax.swing包中的JEditorPane类可以解释执行html文件。也就是说,如果把html文件 读 入 到 JEditorPane,该 html文 件 就 会 被 解 释 执
7、 行,显 示 在JEditorPane中,这样程序就看到了网页的运行效果。JEditorPane类的构造方法类的构造方法 public JEditorPane()public JEditorPane(URL initialPage)throws IOException public JEditorPane(String url)throws IOException 后两个构造方法使用参数initialPage或url指定该对象最初显示的URL中的资源。JEditorPane对象调用public void setPage(URL page)throws IOException方法可以显示新的UR
8、L中的资源。例例11-2用JEditorPane对象显示网页,效果如图11.2所示。2023/1/136例例11-2 运行效果图11.2图11.2 显示网页2023/1/13711.4 处理超链接 当JEditorPane对象调用setEditable()方方法法将编辑属性设为false时,不仅可以显示网页的运行效果,而且用户如果单击网页中超链接,还可以使得JEditorPane对象对象触发HyperlinkEvent事件事件。程序可以通过处理HyperlinkEvent事事件件,来显示新的URL资源。JEditorPane对象调用addHyperlinkListener(HyperlinkL
9、istener listener)获得监视器。监视器需实现HyperlinkListener接接口口,该接口中的方法是:void hyperlinkUpdate(HyperlinkEvent e)例例11-3中中,当单击超链接时,JEditorPane对象将显示超链接所链接的网页。2023/1/13811.5 InetAddress类 包中的InetAddress类对象含有一个Internet主机地址的域名和IP地址: 可以使用InetAddress类的静态方法getByName(String s);将一个域名或IP地址传递给该方法的参数s,获得一个InetAddress对象。该对象含有主机地
10、址的域名和IP地址,该对象用如下格式表示它包含的信息: 例例11-4分别获取域名是的主机域名和IP地址,同时获取IP地址是166.111.222.3的主机域名。注:注:运行上述程序时应保证已经连接到Internet上。上述程序的运行结果如下: String getHostName()获取InetAddress对象所含的域名。public String getHostAddress()获取InetAddress对象所含的IP地址。2获取本地机的地址获取本地机的地址 可以使用InetAddress类的静态方法getLocalHost();获得一个InetAddress对象,该对象含有本地机的域名和
11、IP地址。2023/1/13911.6 套接字Socket IP地址标识Internet上的计算机,端端口口号号标识正在计算机上运行的进程(程序)。端口号端口号与IP地址的组合得出一个网络套接字网络套接字。端端口口号号被规定为一个16位的整数065535。其中,01023被预先定义的服务通信占用,应该使用102465535这些端口中的某一个进行通信,以免发生端口冲突。当两个程序需要通信时,它们可以通过使用Socket类类建立套套接接字字对对象象并连接在一起。比如,有人让你去“中山广场邮局”,你可能反问“我去做什么”,因为他没有告知你“端口”,你不知处理何种业务。他说:“中山广场邮局,8号窗口”
12、,那么你到达地址“中山广场邮局”,找到“8号”窗口,就知道 8号窗口处理特快专递业务,而且必须有个先决条件,就是你到达“中山广场邮局,8号窗口”时,该窗口必须有一位业务员在等待客户,否则就无法建立通信业务。套套接接字字连连接接,就是客户端的套接字对象和服务器端的套接字对象通过输入输出流连接在一起,现在我们分3个步骤来说明套接字连接的基本模式。2023/1/131011.6 套接字连接_(1)服务器建立ServerSocket对象 ServerSocket对象对象负责等待客户端请求建立套接字连接。服务器必须事先建立一个等待客户请求建立套接字连接的ServerSocket对象对象。ServerSo
13、cket的构造方法是ServerSocket(int port);port是一个端口号,必须和客户请求的端口号相同。当建立服务器套接字时可能发生IOException异异常常,因此要像下面那样建立接收客户的服务器套接字。try ServerSocket waitSocketConnection=new ServerSocket(1880);catch(IOException e)2023/1/1311续 11.6 套接字连接_(1)服务器建立ServerSocket对象 当服务器的ServerSocket对对象象waitSocketConnection建立后,就可以使用方法accept()接受
14、客户的套接字连接请求,如下所示:waitSocketConnection.accept();接收客户的套接字也可能发生IOException异异常常,因此要像下面那样建立接收客户的套接字。try Socket socketAtServer=waitSocketConnection.accept();catch(IOException e)所谓接收客户的套接字请求,就是accept()方方法法会返回一个Socket对对象象socketAtServer(服务器端的套接字对象)。但是,accept()方方法法不会立刻返回,该方法会堵塞服务器端当前线程的执行,直到有客户端请求建立套接字连接。就是说,如
15、果没有客户请求建立套接字连接,那么下述代码中的System.out.println(ok);总不会被执行:try Socket socketAtServer=waitSocketConnection.accept();System.out.println(ok)catch(IOException e)注注:ServerSocket对象可以调用setSoTimeout(int timeout)方法设置超时值(单位是毫秒),timeout是一个正值。当ServerSocket对象调用accept()方法堵塞的时间一旦超过timeout时,将触发SocketTimeoutException。2023
16、/1/131211.6 套接字连接_(2)客户端创建Socke对象 客户端程序可以使用Socket类类创建对象 Socket的构造方法如下:Socket(String host,int port)参数host是服务器的IP地址,port是一个端口号。创建Socket对象可能发生IOException异异常常,因此要像下面那样建立到服务器的套接字连接。try Socket socketAtClient=new Socket(http:/192.168.0.78,1880);catch(IOException e)客户端建立socketAtClient对对象象的过程就是向服务器发出套接字连接请求,
17、如果服务器端相应的端口上有ServerSocket对对象象正在使用accept()方方法法等待客户,那么双方的套接字对象对象socketAtClient和和socketAtServer就都诞生了。也可以使用Socket类不带参数的构造方法public Socket()创建一个套接字对象,该对象不请求任何连接。该对象再调用 public void connect(SocketAddress endpoint)throws IOException请 求 与 参 数SocketAddress指定地址的套接字建立连接。为了使用connect()方方法法,可以使用SocketAddress的子子类类In
18、etSocketAddress创建一个对象,InetSocketAddress的构造方法如下:public InetSocketAddress(InetAddress addr,int port)2023/1/131311.6 套接字连接_(3)流连接 客户端和服务器端的套接字对象诞生以后,还必须进行输入输出流的连接。服务器端的这个Socket对对象象socketAtServer使用方法getOutputStream()获得的输出流将指向客户端Socket对对象象socketAtClient使用方方法法getInputStream()获得的那个输入流。同样,服务器端的这个Socket对对象象s
19、ocketAtServer使用方法getInputStream()获得的输入流将指向客户端Socket对对象象socketAtClient使用方法getOutputStream()获得的那个输出流。因此,当服务器向这个输出流写入信息时,客户端通过相应的输入流就能读取,反之亦然,如图图11.3套接字连接示意图套接字连接示意图所示。连接建立后,服务器端的套接字对象调用getInetAddress()方方法法可以获取一个InetAddess对象对象,该对象含有客户端的IP地址和域名。同样,客户端的套接字对象调用getInetAddress()方方法法可以获取一个InetAddess对象对象,该对象含
20、有服务器端的IP地址和域名。套接字调用close()方方法法可以关闭双方的套接字连接,只要一方关闭连接,就会导致对方发生IOException异常。例例11-5中中,客户端向服务器发出ASCII表的顺序值1127,服务器接收这些数据,并将顺序值对应的字符返回给客户。效果如图效果如图11.4,11.5所示所示。2023/1/1314 图11.3 套接字连接示意图2023/1/1315 例例11-5中运行中运行效果图11.4,11.52023/1/131611.7 使用多线程处理套接字连接 套接字连接中涉及到输入流和输出流操作,客户端或服务器读取数据可能会引起堵塞,我们应把读取数据放在一个单独的线
21、程中去进行。另外,服务器收到一个客户的套接字后,就应该启动一个专门为该客户服务的线程。例例11-6中中,客户输入一个一元二次方程的系数并发送给服务器,服务器把计算出的方程的实根返回给客户。因此,用户可以将计算量大的工作放在服务器端,客户端负责计算量小的工作,实现客户服务器交互计算,来完成某项任务。效效果果如如图图11.6,11.7所示所示。首先将例11-6中服务器端的程序编译通过,并运行起来,等待客户的呼叫。2023/1/1317 例例11-6中运行中运行效果图11.6,11.72023/1/131811.8 UDP数据报_概述 前面学习了基于TCP协议的网络套接字(Socket),套接字属于
22、有连接的通信方式,非常像生活中的电话通信,一方呼叫,另一方负责监听,一旦建立了连接,双方就可以进行通信了。本节将介绍Java中基于UDP(用户数据报协议)的网络信息传输方式。基于UDP的通信和基于TCP的通信不同,基于UDP的信息传递更快,但不提供可靠性保证。也就是说,数据在传输时,用户无法知道数据能否正确到达目的地主机,也不能确定数据到达目的地的顺序是否和发送的顺序相同。既然UDP是一种不可靠的协议,为什么还要使用它呢?如果要求数据必须绝对准确地到达目的地,显然不能选择UDP协议来通信。但有时候人们需要较快速地传输信息,并能容忍小的错误,就可以考虑使用UDP协议。基于UDP通信的基本模式是如
23、下:将数据打包,称为数据报,然后将数据报发往目的地;接受别人发来的数据报,然后查看数据报中的内容。2023/1/131911.8 UDP数据报_1发送数据 1)创建创建DatagramPacket对象对象 用DatagramPacket类类将数据打包,即用DatagramPacket类类创建一个对象,称为数据报。用DatagramPacket的类类以下两个构造方法创建待发送的数据报:DatagramPacket(byte data,int length,InetAddtress address,int port)DatagramPacket(byte data,int offset,int l
24、ength,InetAddtress address,int port)使用构造方法创建的数据报对象具有下列两个性质:含有data数组指定的数据。该数据报将发送到地址是address、端口号是port的主机上。称address是它的目标地址,port是这个数据报的目标端口号。第2个构造方法创建的数据报对象含有数组data从offset开始指定长度的数据。例如,byte data=近来好吗近来好吗.getByte();InetAddtress address=InetAddtress.getName();DatagramPacket data_pack=new DatagramPacket(da
25、ta,data.length,address,980);注注:用上述方法创建的用于发送的数数据据报报data_packdata_pack调用方法public int getPort()可以获取该数据报目标端口号;调用方方法法public InetAddress getAddres()可以获取这个数据报的目标地址;调用方法方法public byet getData()可以获取数据报中的数据。2)发送数据发送数据 用DatagramSocket类的不带参数的构构造造方方法法DatagramSocket()创建一个对象,该对象负责发送数据报。例如 DatagramSocket mail_out=ne
26、w DatagramSocket();mail_out.send(data_pack);2023/1/132011.8 UDP数据报_2接收数据 用DatagramSocket类另一个构造方法DatagramSocket(int port)创建一个对象,其中的参数必须和待接收的数据报的端口号相同。例如,如果发送方发送的数据报的端口号是5666:DatagramSocket mail_in=new DatagramSocket(5666);该对对象象mail_in使用方法receive(DatagramPacket pack)接收数据报。该方法有一个数据报参数pack,方方法法receive()
27、把收到的数据报传递给该参数。因此,我们必须预备一个数据报以便收取数据报。这时需使用DatagramPacket类类的另外一个构造方法DatagramPacket(byte data,int length)创建一个数据报,用于接收数据报。例如,byte data=new byte100;int length=90;DatagramPacket pack=new DatagramPacket(data,length);mail_in.receive(pack);该数据报pack将接收长度是length的数据放入data。注:注:receive()方法方法可能会堵塞,直到收到数据报。如果pack调用
28、方方法法getPort()可以获取所收数据报是从远程主机上的哪个端口发出的,即可以获取包的始发端口号;调用方方法法InetAddress getAddres()可获取这个数据报来自哪个主机,即可以获取包的始发地址。我们称主机发出数据报使用的端口号为该包的始发端口号,发送数据报的主机地址称为数据报的始发地址。数据报数据的长度不要超过8192k。例例11-7中中,两个主机(可用本地机模拟)互相发送和接收数据报。2023/1/132111.9 广播数据包 广播数据报类似于电台广播,进行广播的电台需在指定的波段和频率上广播信息,接收者只有将收音机调到指定的波段、频率上才能收听到广播的内容。广播数据报涉
29、及到地址和端口地址和端口。Internet的地址是a.b.c.d的形式。该地址的一部分代表用户自自己己主主机机,而另一部分代表用户所所在在的的网网络络。当a小于128,那么b.c.d就用来表示主机,这类地址称做A类地址。如果a大于等于128并且小于192,则a.b表示网络地址,而c.d表示主机地址,这类地址称做B类地址。如果a大于等于192,则网络地址是a.b.c,d表示主机地址,这类地址称做C类地址。224.0.0.0与239.255.255.255之间的地址称做D类地址,D类地址并不代表某个特定主机的位置。一个具有A、B或C类地址的主机要广播数据或接收广播,都必须加入到同一个D类地址。一个
30、D类地址也称做一个组播地址,加入到同一个组播地址的主机可以在某个端口上广播信息,也可以在某个端口号上接收信息。准备广播或接收的主机需经过下列步骤:准备广播或接收的主机需经过下列步骤:1设置组播地址设置组播地址 使用InetAddress类创建组播组地址,如 InetAddress group=InetAddress.getByName(239.255.8.0);2创创建建多多点点广广播播套套接接字字 使用MulticastSocket类类创建一个多点广播套接字对象。MulticastSocket的构造方法如下:public MulticastSocket(int port)throws IOE
31、xception 创建的多点广播套接字可以在参数指定的端口上广播。2023/1/132211.9 广播数据包 _23设设置置广广播播的的范范围围 准备广播的主机必须让多点广播套接字(MulticastSocket)对象调用public void setTimeToLive(int ttl)throws IOException方法设置广播的范围。其中参数ttl的取值范围是0255,代表广播的数据能经过的路由器的最大数目。4加加入入组组播播组组 准备广播或接收的主机必须让多点广播套接字(MulticastSocket)对象调用public void joinGroup(InetAddress mc
32、astaddr)throws IOException方法加入组播组。多点广播套接字(MulticastSocket)对象调用public void leaveGroup(InetAddress mcastaddr)throws IOException方法可以离开已经加入的组播组。5广广播播数数据据和和接接收收数数据据 进行广播的主机可以让多点广播套接字(MulticastSocket)对象调用public void send(DatagramPacket p)throws IOException将参数p指定的数据报广播到组播组中的其他主机。接收广播的主机可以让多点广播套接字(Multicast
33、Socket)对象调用public void receive(DatagramPacket p)throws IOException方法接收广播的数据报中的数据,并将接收的数据存放到参数p指定的数据报中。例例11-8中中,一个主机不断地重复广播奥运会新闻,加入到同一组的主机都可以随时接收广播的信息。接收者将正在接收的信息放入一个文本区,把已接收到的全部信息放入另一个文本区。2023/1/132311.10 Java远程调用远程调用 Java远程调用(Remote Method Invocation,RMI)是一种分布式技术,使用RMI可以让一个虚拟机上的应用程序请求调用位于网络上另一处虚拟机上
34、的对象。习惯上称发出调用请求的虚拟机为(本地)客户机,称接受并执行请求的虚拟机为(远程)服务器。2023/1/132411.10 Java远程调用远程调用_1远程对象及其代理远程对象及其代理 1)远程对象远程对象 驻留在(远程)服务器上的对象是客户要请求的对象,称作远程对象,即客户程序请求远程对象调用方法,然后远程对象调用方法并返回必要的结果。2)代理与存根(代理与存根(Stub)RMI不希望客户应用程序直接与远程对象打交道,代替地让用户程序和远程对象的代理打交道。代理的特点是它与远程对象实现了相同的接口,当用户请求代理调用这样的方法时,如果代理确认远程对象能调用相同的方法时,就把实际的方法调
35、用委派给远程对象。RMI会帮助生成一个存根(Stub):一种特殊的字节码,并让这个存根产生的对象做为远程对象的代理。代理需要驻留在客户端。因此,在RMI中,用户实际上是在和远程对象的代理直接打交道,用户想请求远程对象调用某个方法,只需向远程代理发出同样的请求即可,如图如图11.8所示所示。3)Remote接口接口 RMI为了标识一个对象是远程对象,即可以被客户请求的对象,要求远程对象必须实现java.rmi包中的Remote接口,也就是说只有实现该接口的类的实例才被RMI认为是一个远程对象。Remote接口中没有方法,该接口仅仅起到一个标识作用,因此,必须扩展Remote接口,以便规定远程对象
36、的那些方法是客户可以请求的方法,用户程序不必编写和远程代理的有关代码,只需知道远程代理和远程对象实现了相同的接口。2023/1/1325 图11.8 远程代理与远程对象 2023/1/132611.10 2RMIRMI的设计细节的设计细节 _ _1)1)扩展扩展RemoteRemote接口接口 为了叙述的方便,我们假设本地客户机存放有关类的目录是D:Client;远程服务器的IP是127.0.0.1,存放有关类的目录是D:Server。1)1)扩展扩展RemoteRemote接口接口 定义一个接口是java.rmi包中Remote的子接口,即扩展Remote接口。以下是我们定义的Remote的
37、子接口是RemoteSubject。RemoteSubject子接口中定义了计算面积的方法,即要求远程对象为用户计算某种几何图形的面积。RemoteSubject的代码如下:import java.rmi.*;public interface RemoteSubject extends Remote public void setHeight(double height)throws RemoteException;public void setWidth(double width)throws RemoteException;public double getArea()throws Rem
38、oteException;该接口需要保存在前面约定的远程服务器的D:Server目录中,并编译它生成相应的.class字节码文件。由于客户端的远程代理也需要该接口,因此需要将生成的字节码文件RmoteSubject.class复制到前面约定的客户机的D:Client目录中。2023/1/132711.10 2RMIRMI的设计细节的设计细节 _ _2 2)远程对象)远程对象 创建远程对象的类必须要实现RemoteRemote接接口口,RMI使用Remote接口来标识远程对象。RemoteRemote接接口口中没有方法,因此创建远程对象的类需要实现Remote接口的一个子接口。RMI为了让一个对
39、象成为远程对象还需要进行一些必要初始化工作,在编写创建远程对象的类时,可以简单让该类是RMI提供的java.rmi.server包中的UnicastRemoteObject类的子类即可。以下是我们定义的创建远程对象的类,该类是UnicastRemoteObjectUnicastRemoteObject类类的子类并实现了上述RemoteSubjectRemoteSubject接接口口,所创建的远程对象可以计算矩形的面积.import java.rmi.*;import java.rmi.server.UnicastRemoteObject;public class RemoteConcreteS
40、ubject extends UnicastRemoteObject implements RemoteSubject double width,height;public RemoteConcreteSubject()throws RemoteException public void setWidth(double width)throws RemoteException this.width=width;public void setHeight(double height)throws RemoteException this.height=height;public double g
41、etArea()throws RemoteException return width*height;2023/1/132811.10 2RMIRMI的设计细节的设计细节 _ _3 3)存根()存根(StubStub)与代理)与代理 RMI负责产生存根(Stub Object),如果创建远程对象的字节码是RemoteConcreteSubject.class,那 么 存 根(Stub)的 字 节 码 是RemoteConcreteSubject_Stub.class,即后缀为_Stub。RMI使用rmic命令生成存根:RemoteConcreteSubject_Stub.class。首先进入D
42、:Server目录,然后如下执行rmic命令:rmic RemoteConcreteSubjectrmic RemoteConcreteSubject如图11.9所示。执行过rmicrmic命命令令将产生存根 RemoteConcreteSubject_Stub.class(在D:Server中)。客户端需要使用存根(Stub)来创建一个对象,即远程代理,因此需要将RemoteConcreteSubject_Stub.class复制到前面约定的客户机的D:Client目录中。2023/1/132911.10 2RMIRMI的设计细节的设计细节 _ _4 4)启动注册()启动注册(rmiregi
43、stryrmiregistry)在远程服务器创建远程对象之前,RMI要求远程服务器必须首先启动注册:rmiregistry,只有启动了rmiregistry,远程服务器才可以创建远程对象,并将该对象注册到rmiregistry所管理的注册表中。在远程服务器开启一个终端,比如在MS-DOS命令行窗口进入D:Server目录,然后执行rimregistry命令:rmiregistryrmiregistry启动注册,如图11.10所示。也可以后台启动注册:start rmiregistrystart rmiregistry2023/1/133011.10 2RMIRMI的设计细节的设计细节 _ _5
44、 5)启动远程对象服务)启动远程对象服务 远程服务器启动注册rmiregistry后,远程服务器就可以启动远程对象服务了,即编写程序来创建和注册远程对象,并运行该程序。远程服务器使用java.rmi包中的Naming类调用其类方法:rebind(String name,Remote obj)rebind(String name,Remote obj)绑定一个远程对象到rmiregistry所管理的注册表中,该方法的name参数是URL格式,obj参数是远程对象,将来客户端的代理会通过name找到远程对象obj。以下是我们编写的远程服务器上的应用程序,运行该程序就启动了远程对象服务,该应用程序可
45、以让用户访问它注册的远程对象。效果如图11.11import java.rmi.*;/BindRemoteObject.javapublic class BindRemoteObject public static void main(String args)try RemoteConcreteSubject remoteObject=new RemoteConcreteSubject();Naming.rebind(rmi:/127.0.0.1/rect,remoteObject);System.out.println(be ready for client server.);catch(E
46、xception exp)System.out.println(exp);2023/1/133111.10 2RMIRMI的设计细节的设计细节 _ _6 6)运行客户端程序)运行客户端程序 远程服务器启动远程对象服务后,客户端就可以运行有关程序,访问使用远程对象。客户端使用java.rmi包中的Naming类调用其类方法lookup(String lookup(String name)name)返回一个远程对象的代理,即使用存根(Stub)产生一个和远程对象具有同样接口的对象。lookup(String lookup(String name)name)方法中的name参数的取值必须是远程对象注
47、册的name,比如:rmi:/127.0.0.1/rect。客户程序可以像使用远程对象一样来使用lookup(String name)lookup(String name)方法方法返回的远程代理。ClientApplication使用远程代理计算了矩形的面积。程序运行效果如图11.12所示.import java.rmi.*;public class ClientApplication public static void main(String args)try Remote remoteObject=Naming.lookup(rmi:/127.0.0.1/rect);RemoteSubject remoteSubject=(RemoteSubject)remoteObject;remoteSubject.setWidth(129);remoteSubject.setHeight(528);double area=remoteSubject.getArea();System.out.println(面积面积:+area);catch(Exception exp)System.out.println(exp.toString();2023/1/1332