当前位置:首页 >> 小学教育 >>

Java 中的网络编程


第11章 Java 中的网络编程
?本章导读
? ? ? ?

?
? ? ? ? ?

URL类 读取URL中的资源 显示URL资源中的HTML文件 处理超链接 InetAddress类 套接字Socket 使用多线程处理套接字连接 UDP数据报 广播数据 Java远程调用
1

>2012-7-24

概述
本 章 重 点 介 绍 4 个 重 要 的 类 URL 、 Socket 、 InetAddress 和 DatagramSocket。 网络的一些基本知识 :
◆ IP(Internet Protocol)地址:IP地址是用于惟一标识连接到Internet的计算机的数字 地 址 是 由 32 位 二 进 制 数 组 成 , 如 202.199.28.6 。 没 有 IP 地 址 就 不 能 区 分 连 在 Internet上不同的计算机。 ◆ 域 名 : 用 字 符 形 式 表 示 连 接 到 Internet 的 计 算 机 的 数 字 地 址 。 如 域 名 “www.tsinghua.edu.cn”和IP“202.108.35.210”是一个主机的两种表示法。 ◆域名服务器(DNS):负责将域名与IP地址的转化。 ◆ URL(Uniform Resource Locator,统一资源定位符):标识了计算机上的资源。一个URL通常 包含一些重要的信息,如http://www.dlrin.edu.cn/hotlink.html 包含了如下信息:
?
? ?

http 服务使用的协议(HTTP)。 dlrin.edu.cn 存储资源的计算机的域名地址。 hotlink.html 资源。

◆客户-服务器体系结构: 客户需要某些类型的信息,而服务器提供客户所需要 的信息。客户需要连接到服务器上,并向服务器请求信息,服务器则向客户发送 信息,两者按照协议协同工作,各得其所。
2012-7-24 2

11.1 URL类

java.net包中的 URL类是对URL的抽象,使用URL创建对象的 应用程序称为客户端程序,一个URL对象存放着一个具体的资源的 引用,表明客户要访问这个URL中的资源,利用URL对象可以获取 URL中的资源。 一个URL对象通常包含最基本的三部分信息协议、地址、资源。 URL的构造方法
◆ public URL(String spec) throws MalformedURLException 使用字符串初始化一个
URL对象,如 try { url=new URL("http://yahoo.com.cn"); } catch(MalformedURLException e){ System.out.println ("Bad URL:"+url); }

该URL对象使用的协议是HTTP,即用户按照这种协议与指定的服务器通信, 该URL对象包含的地址是“yahoo.com.cn”,所包含的资源是默认的资源(主 页)。 ◆public URL(String protocol,String host,String file) throws MalformedURLException
构造的URL对象的协议、地址和资源分别由参数protocol、host和file指定。
2012-7-24 3

11.2 读取URL中的资源
URL对象调用InputStream openStream() 方法可以返回一个输入 流,该输入流指向URL对象所包含的资源。通过该输入流可以将 服务器上的资源信息读入到客户端。 例11-1(效果如图11.1 所示)在一个文本框中输入 网址,然后单击“确定”按 钮读取服务器上的资源。由 于网络速度或其他因 素,URL资 源的读取可能会 引起堵塞,因此程序需在一 个线程中读取URL资源,以 免堵塞主线程。
2012-7-24 4

11.3 显示URL资源中的HTML文件
在上面的例11-1中, http://www.yahoo.com.cn的主页的内容显示 在文本区中,但有时候我们想看到网页的运行效果。javax.swing包 中的JEditorPane类可以解释执行html文件。也就是说,如果把html文 件 读 入 到 JEditorPane, 该 html 文 件 就 会 被 解 释 执 行 , 显 示 在 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方法可以显示新的URL 中的资源。 例11-2用JEditorPane对象显示网页,效果如图11.2所示。
2012-7-24 5

例11-2 运行效果图11.2

图11.2 显示网页

2012-7-24

6

11.4 处理超链接
当JEditorPane对象调用setEditable()方法将编辑属性设为false 时,不仅可以显示网页的运行效果,而且用户如果单击网页中超 链接,还可以使得JEditorPane对象触发HyperlinkEvent事件。 程序可以通过处理HyperlinkEvent事件,来显示新的URL资 源。JEditorPane对象调用addHyperlinkListener(HyperlinkListener listener) 获得监视器。监视器需实现HyperlinkListener接口,该接口中的 方法是:void hyperlinkUpdate(HyperlinkEvent e) 例11-3中,当单击超链接时,JEditorPane对象将显示超链接所 链接的网页。

2012-7-24

7

11.5 InetAddress类

java.net包中的InetAddress类对象含有一个Internet主机地址的域名和IP地址: www.sina.com.cn/202.108.35.210 。域名容易记忆,在连接网络时输入一个主机的 域名后,域名服务器(DNS)负责将域名转化成IP地址,这样我们才能和主机建立连接。 1.获取Internet上主机的地址 可以使用InetAddress类的静态方法getByName(String s);将一个域名或IP地址传 递给该方法的参数s,获得一个InetAddress对象。该对象含有主机地址的域名和 IP地址,该对象用如下格式表示它包含的信息:www.sina.com.cn/202.108.37.40 例11-4分别获取域名是www.sina.com.cn的主机域名和IP地址,同时获取IP地 址是166.111.222.3的主机域名。注:运行上述程序时应保证已经连接到Internet上。 上述程序的运行结果如下:www.sina.com.cn/202.108.37.40 maix.tup.tsinghua.edu.cn/166.111.222.3 另外,InetAddress类中含有两个实例方法:
◆ public String getHostName() 获取InetAddress对象所含的域名。 ◆ public String getHostAddress() 获取InetAddress对象所含的IP地址。

2.获取本地机的地址 可以使用InetAddress类的静态方法getLocalHost();获得一个InetAddress对象, 该对象含有本地机的域名和IP地址。
2012-7-24 8

11.6 套接字Socket
IP地址标识Internet上的计算机,端口号标识正在计算机上运 行的进程(程序)。 端口号与IP地址的组合得出一个网络套接字。 端口号被规定为一个16位的整数0~65535。其中,0~1023被 预先定义的服务通信占用, 应该使用1024~65535这些端口中的某 一个进行通信,以免发生端口冲突。 当两个程序需要通信时,它们可以通过使用Socket类建立套接 字对象并连接在一起。比如,有人让你去“中山广场邮局”,你可 能反问“我去做什么”,因为他没有告知你“端口”,你不知处 理何种业务。他说:“中山广场邮局,8号窗口”,那么你到达 地址“中山广场邮局”,找到“8号”窗口,就知道 8号窗口处 理特快专递业务,而且必须有个先决条件,就是你到达“中山广 场邮局,8号窗口”时,该窗口必须有一位业务员在等待客户,否则 就无法建立通信业务。 套接字连接,就是客户端的套接字对象和服务器端的套接字 对象通过输入输出流连接在一起,现在我们分3个步骤来说明套 9 2012-7-24

11.6 套接字连接_(1)服务器建立ServerSocket对象
◆ ServerSocket对象负责等待客户端请求建立套接字连接。 服务器必须事先建立一个等待客户请求建立套接字连接的 ServerSocket对象。 ServerSocket的构造方法是ServerSocket(int port) ; port是一个端口 号,必须和客户请求的端口号相同。 当建立服务器套接字时可能发生IOException异常,因此要像 下面那样建立接收客户的服务器套接字。
try{ ServerSocket waitSocketConnection=new ServerSocket(1880); } catch(IOException e){}

2012-7-24

10

续 11.6 套接字连接_(1)服务器建立ServerSocket对 象
◆ 当服务器的ServerSocket对象waitSocketConnection建立后,就可以使用方法 accept()接受客户的套接字连接请求,如下所示: waitSocketConnection.accept(); 接收客户的套接字也可能发生IOException异常,因此要像下面那样建立接 收客户的套接字。
try{ Socket socketAtServer= waitSocketConnection.accept(); } catch(IOException e){}

所 谓 接 收 客 户 的 套 接 字 请 求 , 就 是 accept() 方 法 会 返 回 一 个 Socket 对 象 socketAtServer(服务器端的套接字对象)。但是,accept()方法不会立刻返回,该方法 会堵塞服务器端当前线程的执行,直到有客户端请求建立套接字连接。就是说,如 果没有客户请求建立套接字连接,那么下述代码中的"System.out.println("ok");" 总不会被执行:
try{ Socket socketAtServer = waitSocketConnection.accept(); System.out.println("ok") } catch(IOException e){}

注:ServerSocket对象可以调用setSoTimeout(int timeout)方法设置超时值(单位是 毫秒),timeout是一个正值。当ServerSocket对象调用accept()方法堵塞的时间一 11 2012-7-24 旦超过timeout时,将触发SocketTimeoutException。

11.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对象的过程就是向服务器发出套接字连接请求, 如果服务器端相应的端口上有ServerSocket对象正在使用accept()方法等待客户, 那么双方的套接字对象socketAtClient和socketAtServer就都诞生了。 ◆也可以使用Socket类不带参数的构造方法public Socket() 创建一个套接字对象, 该对象不请求任何连接。该对象再调用 public void connect(SocketAddress endpoint) throws IOException 请 求 与 参 数 SocketAddress指定地址的套接字建立连接。 为了使用connect()方法,可以使用SocketAddress的子类InetSocketAddress创 建一个对象,InetSocketAddress的构造方法如下:
public InetSocketAddress(InetAddress addr,int port)
2012-7-24 12

11.6 套接字连接_(3)流连接

客户端和服务器端的套接字对象诞生以后,还必须进行输入输出流的连接。 服务器端的这个 Socket对象socketAtServer使用方法 getOutputStream()获得的 输出流将指向客户端 Socket对象socketAtClient 使用 方法getInputStream() 获得的那 个输入流。 同样,服务器端的这个 Socket对象socketAtServer 使用方法 getInputStream() 获得 的输入流将指向客户端 Socket对象socketAtClient 使用方法 getOutputStream() 获得 的那个输出流。 因此,当服务器向这个输出流写入信息时,客户端通过相应的输入流就能读取, 反之亦然,如图11.3套接字连接示意图所示。 连接建立后,服务器端的套接字对象调用 getInetAddress()方法 可以获取一个 InetAddess对象,该对象含有客户端的IP地址和域名。 同样,客户端的套接字对象调用 getInetAddress()方法可以获取一个InetAddess 对象,该对象含有服务器端的IP地址和域名。 套接字调用close()方法可以关闭双方的套接字连接,只要一方关闭连接,就会 导致对方发生IOException异常。 例11-5中,客户端向服务器发出ASCII表的顺序值1~127, 服务器接收这些数 据,并将顺序值对应的字符返回给客户。效果如图11.4, 11.5所示 。
2012-7-24 13

图11.3 套接字连接示意图

2012-7-24

14

例11-5中运行效果图11.4, 11.5

2012-7-24

15

11.7 使用多线程处理套接字连接
套接字连接中涉及到输入流和输出流操作,客户端或服务器 读取数据可能会引起堵塞,我们应把读取数据放在一个单独的线 程中去进行。另外,服务器收到一个客户的套接字后,就应该启 动一个专门为该客户服务的线程。 例11-6中,客户输入一个一元二次方程的系数并发送给服务 器,服务器把计算出的方程的实根返回给客户。因此,用户可以 将计算量大的工作放在服务器端,客户端负责计算量小的工作, 实现客户—服务器交互计算,来完成某项任务。效果如图11.6, 11.7所示 。 首先将例11-6中服务器端的程序编译通过,并运行起来,等 待客户的呼叫。

2012-7-24

16

例11-6中运行效果图11.6, 11.7

2012-7-24

17

11.8 UDP数据报_概述
前面学习了基于TCP协议的网络套接字(Socket),套接字属于 有连接的通信方式,非常像生活中的电话通信,一方呼叫,另一方 负责监听,一旦建立了连接,双方就可以进行通信了。 本节将介绍Java中基于UDP(用户数据报协议)的网络信息传输 方式。基于UDP的通信和基于TCP的通信不同,基于UDP的信息传递 更快,但不提供可靠性保证。也就是说,数据在传输时,用户无法 知道数据能否正确到达目的地主机,也不能确定数据到达目的地的 顺序是否和发送的顺序相同。 既然UDP是一种不可靠的协议,为什么还要使用它呢?如果要求 数据必须绝对准确地到达目的地,显然不能选择UDP协议来通信。 但有时候人们需要较快速地传输信息,并能容忍小的错误,就可以 考虑使用UDP协议。 基于UDP通信的基本模式是如下: 将数据打包,称为数据报,然后将数据报发往目的地;接受别人发 来的数据报,然后查看数据报中的内容。
2012-7-24 18

11.8 UDP数据报_1.发送数据
1)创建DatagramPacket对象 用DatagramPacket类将数据打包,即用DatagramPacket类创建一个对象,称 为数据报。用DatagramPacket的类以下两个构造方法创建待发送的数据报:
DatagramPacket(byte data[ ],int length,InetAddtress address,int port) DatagramPacket(byte data[ ],int offset,int length,InetAddtress address,int port)

使用构造方法创建的数据报对象具有下列两个性质: ◆含有data数组指定的数据。 ◆该数据报将发送到地址是address、端口号是port的主机上。 称address是它的目标地址,port是这个数据报的目标端口号。第2个构造方法 创建的数据报对象含有数组data从offset开始指定长度的数据。例如,
byte data[ ]="近来好吗".getByte(); InetAddtress address=InetAddtress.getName("www.sian.com.cn"); DatagramPacket data_pack=new DatagramPacket(data,data.length, address,980); 注:用上述方法创建的用于发送的数据报data_pack调用方法public int getPort()可以获 取该数据报目标端口号;调用方法public InetAddress getAddres()可以获取这个数据报的 目标地址;调用方法public byet[ ] getData()可以获取数据报中的数据。

2)发送数据 用DatagramSocket类的不带参数的构造方法DatagramSocket()创建一个对象, 该对象负责发送数据报。例如 DatagramSocket mail_out=new DatagramSocket();
mail_out.send(data_pack);
2012-7-24 19

11.8 UDP数据报_2.接收数据

用DatagramSocket类另一个构造方法DatagramSocket(int port)创建一个对象, 其中的参数必须和待接收的数据报的端口号相同。例如,如果发送方发送的数据 报的端口号是5666:DatagramSocket mail_in=new DatagramSocket(5666); 该对象mail_in使用方法receive(DatagramPacket pack)接收数据报。该方法有一 个数据报参数pack,方法receive()把收到的数据报传递给该参数。因此,我们必 须预备一个数据报以便收取数据报。这时需使用DatagramPacket类的另外一个 构造方法DatagramPacket(byte data[],int length)创建一个数据报,用于接收数据 报。例如,byte data[]=new byte[100];int length=90;
DatagramPacket pack=new DatagramPacket(data,length); mail_in.receive(pack);

该数据报pack将接收长度是length的数据放入data。 注:① receive()方法可能会堵塞,直到收到数据报。
② 如果pack调用方法getPort()可以获取所收数据报是从远程主机上的哪个端口发出 的,即可以获取包的始发端口号;调用方法InetAddress getAddres()可获取这个数据报来 自哪个主机,即可以获取包的始发地址。我们称主机发出数据报使用的端口号为该包的 始发端口号,发送数据报的主机地址称为数据报的始发地址。 ③ 数据报数据的长度不要超过8192k。

例11-7中,两个主机(可用本地机模拟)互相发送和接收数据报。
2012-7-24 20

11.9 广播数据包
广播数据报类似于电台广播,进行广播的电台需在指定的波段和频率上广播 信息,接收者只有将收音机调到指定的波段、频率上才能收听到广播的内容。 广播数据报涉及到地址和端口。 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类地址。一个D类地址也称做一个组播地址,加入到同一个组播地址的主 机可以在某个端口上广播信息,也可以在某个端口号上接收信息。 准备广播或接收的主机需经过下列步骤: 1.设置组播地址 使用InetAddress类创建组播组地址,如
InetAddress group=InetAddress.getByName("239.255.8.0");

2.创建多点广播套接字 使用MulticastSocket类创建一个多点广播套接字对象。 MulticastSocket的构造方法如下:public MulticastSocket(int port) throws IOException 创建的多点广播套接字可以在参数指定的端口上广播。 21
2012-7-24

11.9 广播数据包 _2
3.设置广播的范围 准备广播的主机必须让多点广播套接字(MulticastSocket)对象 调用public void setTimeToLive(int ttl) throws IOException方法设置广播的范围。其 中参数ttl的取值范围是0~255,代表广播的数据能经过的路由器的最大数目。 4.加入组播组 准备广播或接收的主机必须让多点广播套接字(MulticastSocket) 对 象调用public void joinGroup(InetAddress mcastaddr) throws IOException方法加入组 播组。 多 点广 播套 接 字 (MulticastSocket) 对 象调 用 public void leaveGroup(InetAddress mcastaddr) throws IOException方法可以离开已经加入的组播组。 5.广播数据和接收数据 进行广播的主机可以让多点广播套接字(MulticastSocket) 对象调用public void send(DatagramPacket p) throws IOException将参数p指定的数据 报广播到组播组中的其他主机。 接收广播的主机可以让多点广播套接字 (MulticastSocket) 对象调用 public void receive(DatagramPacket p) throws IOException方法接收广播的数据报中的数据,并 将接收的数据存放到参数p指定的数据报中。 例11-8中,一个主机不断地重复广播奥运会新闻,加入到同一组的主机都可以 随时接收广播的信息。接收者将正在接收的信息放入一个文本区,把已接收到的 全部信息放入另一个文本区。
2012-7-24 22

11.10 Java远程调用
Java远程调用(Remote Method Invocation,RMI)是一种分布 式技术,使用RMI可以让一个虚拟机上的应用程序请求调用位于网 络上另一处虚拟机上的对象。习惯上称发出调用请求的虚拟机为 (本地)客户机,称接受并执行请求的虚拟机为(远程)服务器。

2012-7-24

23

11.10 Java远程调用_1.远程对象及其代理
1 ) 远程对象 驻留在(远程)服务器上的对象是客户要请求的对象,称作远程对象,即客户程 序请求远程对象调用方法,然后远程对象调用方法并返回必要的结果。 2) 代理与存根(Stub) RMI不希望客户应用程序直接与远程对象打交道,代替地让用户程序和远 程对象的代理打交道。代理的特点是它与远程对象实现了相同的接口,当用户请 求代理调用这样的方法时,如果代理确认远程对象能调用相同的方法时,就把 实际的方法调用委派给远程对象。 RMI会帮助生成一个存根(Stub):一种特殊的字节码,并让这个存根产生 的对象做为远程对象的代理。代理需要驻留在客户端。因此,在RMI中,用户 实际上是在和远程对象的代理直接打交道,用户想请求远程对象调用某个方法,只 需向远程代理发出同样的请求即可,如图11.8所示。 3) Remote接口 RMI为了标识一个对象是远程对象,即可以被客户请求的对象,要求远程 对象必须实现java.rmi包中的Remote接口,也就是说只有实现该接口的类的实例 才被RMI认为是一个远程对象。Remote接口中没有方法,该接口仅仅起到一个 标识作用,因此,必须扩展Remote接口,以便规定远程对象的那些方法是客户 可以请求的方法,用户程序不必编写和远程代理的有关代码,只需知道远程代 理和远程对象实现了相同的接口。
2012-7-24 24

图11.8 远程代理与远程对象

2012-7-24

25

11.10 2.RMI的设计细节 _1)扩展Remote接口

为了叙述的方便,我们假设本地客户机存放有关类的目录是D:\Client;远 程服务器的IP是127.0.0.1,存放有关类的目录是D:\Server。 1)扩展Remote接口 定义一个接口是java.rmi包中Remote的子接口,即扩展Remote接口。 以下是我们定义的Remote的子接口是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 RemoteException; }

该接口需要保存在前面约定的远程服务器的D:\Server目录中,并编译它生 成相应的.class字节码文件。由于客户端的远程代理也需要该接口,因此需要将 生成的字节码文件RmoteSubject.class复制到前面约定的客户机的D:\Client目 录中。
2012-7-24 26

11.10 2.RMI的设计细节 _2)远程对象
创建远程对象的类必须要实现Remote接口,RMI使用Remote接口来标识远程 对象。Remote接口中没有方法,因此创建远程对象的类需要实现Remote接口的一 个子接口。RMI为了让一个对象成为远程对象还需要进行一些必要初始化工作, 在编写创建远程对象的类时,可以简单让该类是RMI提供的java.rmi.server包中 的UnicastRemoteObject类的子类即可。 以下是我们定义的创建远程对象的类,该类是UnicastRemoteObject类的子 类并实现了上述RemoteSubject接口,所创建的远程对象可以计算矩形的面积.
import java.rmi.*; import java.rmi.server.UnicastRemoteObject;
public class RemoteConcreteSubject 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 getArea() throws RemoteException { return width*height; }
2012-7-24

}

27

11.10 2.RMI的设计细节 _3)存根(Stub)与代理
RMI 负 责 产 生 存 根 ( Stub Object ) , 如 果 创 建 远 程 对 象 的 字 节 码 是 RemoteConcreteSubject.class , 那 么 存 根 ( Stub ) 的 字 节 码 是 RemoteConcreteSubject_Stub.class,即后缀为"_Stub"。 RMI使用rmic命令生成存根:RemoteConcreteSubject_Stub.class。首先进 入D:\Server目录,然后如下执行rmic命令:rmic RemoteConcreteSubject 如图11.9所示。 执 行 过 rmic 命 令 将 产 生 存 根 RemoteConcreteSubject_Stub.class ( 在 D:\Server中)。 客户端需要使用存根(Stub)来创建一个对象,即远程代理,因此需要将 RemoteConcreteSubject_Stub.class复制到前面约定的客户机的D:\Client目录 中。

2012-7-24

28

11.10 2.RMI的设计细节 _4)启动注册(rmiregistry)
在远程服务器创建远程对象之前,RMI要求远程服务器必须首 先启动注册:rmiregistry,只有启动了rmiregistry,远程服务 器才可以创建远程对象,并将该对象注册到rmiregistry所管理的 注册表中。 在远程服务器开启一个终端,比如在MS-DOS命令行窗口进入 D:\Server目录,然后执行rimregistry命令:rmiregistry 启动注册,如图11.10所示。也可以后台启动注册:
start rmiregistry

2012-7-24

29

11.10 2.RMI的设计细节 _5)启动远程对象服务
远程服务器启动注册rmiregistry后,远程服务器就可以启动远程对象服务 了,即编写程序来创建和注册远程对象,并运行该程序。远程服务器使用 java.rmi包中的Naming类调用其类方法:rebind(String name, Remote obj) 绑定一个远程对象到rmiregistry所管理的注册表中,该方法的name参数是URL格 式,obj参数是远程对象,将来客户端的代理会通过name找到远程对象obj。 以下是我们编写的远程服务器上的应用程序,运行该程序就启动了远程对象 服务,该应用程序可以让用户访问它注册的远程对象。效果如图11.11
import java.rmi.*; //BindRemoteObject.java public 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(Exception exp){ System.out.println(exp); } } } 30 2012-7-24

11.10 2.RMI的设计细节 _6)运行客户端程序

2012-7-24

远程服务器启动远程对象服务后,客户端就可以运行有关程序,访问使用远程对象。 客户端使用java.rmi包中的Naming类调用其类方法lookup(String name)返回一个远 程 对 象 的 代 理 , 即 使 用 存 根 (Stub) 产 生 一 个 和 远 程 对 象 具 有 同 样 接 口 的 对 象 。 lookup(String name) 方 法 中的 name 参 数的取 值 必 须是 远程 对 象 注册 的 name, 比 如 : "rmi://127.0.0.1/rect"。 客户程序可以像使用远程对象一样来使用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()); } } }
31

2012-7-24

32


相关文章:
Java使用socket网络编程详解
Java使用socket网络编程详解_IT/计算机_专业资料。或许有点长 但是一步步教你 我...2. 在 main 函数里, 根据端口号, 创建一个 ServerSocket 类型的服务器端的 ...
java 网络编程学习资料
java 网络编程学习资料_计算机软件及应用_IT/计算机_专业资料。此文档能够帮助...4. 在 TCP/IP 协议中,有两部分信息用来确定一个指定的程序:互联网地址和端口...
java网络编程复习题(2013考试题库)
JAVA网络编程技术结课试题 5页 10财富值如要投诉违规内容,请到百度文库投诉中心...如果在一个死去的线程上调用 start()方法,会抛出 java.lang....
上机实践10 Java 中的网络编程
上机实践10 Java 中的网络编程_计算机软件及应用_IT/计算机_专业资料。上机实践 10 实验 1 1.答案:【代码 1】 : 【代码 2】 : 【代码 3】 : 【代码 4...
java网络编程试卷及答案
java网络编程试卷及答案_IT/计算机_专业资料。A1、 Java 网络程序位于 TCP/IP ...f) ServerSocket 的 accept()方法从连接请求队列中取出连接请求。 2、问题:...
JAVA语言与网络编程-第一套作业
★单选题:> Java 语言具有许多优点和特点,下列选项中,反映了 Java 程序并行机制的特点的是 A、分布式计算 B、多线程 C、跨平台 D、面向对象技术 ★单选题:> ...
java网络编程典型例题
服 务器端和客户端的网络连接主要是 TCP Socket 连接。在 java.net 包中提供了 Socket 和 ServerSocket 类来实现连接。 在 Socket 编程中发送方和接收方的两...
网络编程技术试题
(接口)表示 2.2 Java 的输入输出机制 Java 的输入输出操作采用流的机制,数据流是指所有的数据通信通道 2.2.1 流的概述 大部分网络编程实质上处理输入和输出—...
java网络编程UDP和TCP
Java 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是...在计算机网络中,现在命名 IP 地址的规定是 IPv4 协议, 该协议规定每个 IP ...
Java网络编程各章理论复习知识要点
Java网络编程各章理论复习知识要点_IT/计算机_专业资料。Java网络编程各章理论复习...()方法中创建子类 SubThread 对象,一般格式为: SubThread thread1=new Sub...
更多相关标签:
java中网络编程 | java网络编程 | java网络编程精解 | java网络编程 pdf | java网络编程实例 | java网络高级编程 | java网络编程实用精解 | 精通java网络编程 |