1、 /用于向客户端发送数据的输出流 DataOutputStream dos = new DataOutputStream(socket.getOutputStream(); /用于接收客户端发来的数据的输入流 DataInputStream dis = new DataInputStream(socket.getInputStream(); System.out.println(服务器接收到客户端的连接请求: + dis.readUTF(); /服务器向客户端发送连接成功确认信息 dos.writeUTF(接受连接请求,连接成功!); /不需要继续使用此连接时,关闭连接 socket.clos
2、e(); ss.close(); catch (IOException e) e.printStackTrace(); 客户端:ClientDemo.javaimport java.io.OutputStream;import .UnknownHostException;public class ClientDemo /* Socket socket = null; socket = new Socket(localhost,8888); /获取输出流,用于客户端向服务器端发送数据 /获取输入流,用于接收服务器端发送来的数据 /客户端向服务器端发送数据我是客户端,请求连接! /打印出从服务器端
3、接收到的数据 System.out.println(dis.readUTF(); /不需要继续使用此连接时,记得关闭哦 catch (UnknownHostException e) RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外 一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。在过去,TCP/IP套接字通讯是远程通讯的主要手段,但此开发方式没有使用面向对 象的方式实现开发,在开发一
4、个如此的通讯机制时往往令程序员感觉到乏味,对此RPC(Remote Procedure Call)应运而生,它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,而且RPC未能做到面向对象调用的开发模 式。针对RPC服务遗留的问题,RMI出现在世人面前,它被设计成一种面向对象的通讯方式,允许程序员使用远程对象来实现通信,并且支持多线程的服务,这 是一次远程通讯的革命,为远程通信开辟新的里程碑。RMI的开发步骤1 先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote2 开发一个类来实现远程接口及远程方法,值得注意的是实现类需要继承Unica
5、stRemoteObject3 通过javac命令编译文件,通过java -server 命令注册服务,启动远程对象4 最后客户端查找远程对象,并调用远程方法简单实例首先为服务建立一个Model层,注意因为此对象需要现实进行远程传输,所以必须继承Serializablec-sharp view plaincopy5 package rmi.model;6 import java.io.Serializable;7 /注意对象必须继承Serializable 8 public class PersonEntity implements Serializable 9 private int id;
6、10 private String name;11 private int age;12 public void setId(int id) 13 this.id = id;14 15 public int getId() 16 return id;17 18 public void setName(String name) 19 this.name = name;20 21 public String getName() 22 return name;23 24 public void setAge(int age) 25 this.age = age;26 27 public int ge
7、tAge() 28 return age;29 30 创建远程接口PersonService,注意远程接口需要继承Remotejava view plaincopy31 package rmi.service;32 import java.rmi.Remote;33 import java.rmi.RemoteException;34 import java.util.List;35 import rmi.model.*;36 /此为远程对象调用的接口,必须继承Remote类 37 public interface PersonService extends Remote 38 public
8、List GetList() throws RemoteException;39 建立PersonServiceImpl实现远程接口,注意此为远程对象实现类,需要继承UnicastRemoteObject40 package rmi.serviceImpl;41 import java.rmi.RemoteException;42 import java.rmi.server.UnicastRemoteObject;43 import java.util.LinkedList;44 import java.util.List;45 import rmi.model.PersonEntity;4
9、6 import rmi.service.*;47 /此为远程对象的实现类,须继承UnicastRemoteObject 48 public class PersonServiceImpl extends UnicastRemoteObject implements PersonService 49 public PersonServiceImpl() throws RemoteException 50 super();51 / TODO Auto-generated constructor stub 52 53 Override 54 public List GetList() throws
10、 RemoteException 55 / TODO Auto-generated method stub 56 System.out.println(Get Person Start!57 List personList=new LinkedListjavac rmi/remotingservice/Program.java获取Program.class(如何阁下使用的MyEclipse等开发工具,可跳 过此步,直接在*/bin文件夹中直接调用已经生成的Program.class),然后输入D:/RMI/RemotingService /srcjava rmi/remotingservice
11、/Program启动服务。75 package rmi.remotingservice;76 import java.rmi.Naming;77 import java.rmi.registry.LocateRegistry;78 79 import rmi.service.*;80 import rmi.serviceImpl.*;81 public class Program 82 public static void main(String args) 83 / TODO Auto-generated method stub 84 try 85 PersonService personS
12、ervice=new PersonServiceImpl();86 /注册通讯端口 87 LocateRegistry.createRegistry(6600);88 /注册通讯路径 89 Naming.rebind(rmi:/127.0.0.1:6600/PersonService, personService);90 System.out.println(Service Start!91 catch (Exception e) 92 / TODO Auto-generated catch block 93 e.printStackTrace();94 95 96 最后建立客户端进行测试,注
13、意客户调用的RMI路径必须服务器配置一致97 package rmi.remotingclient;98 import java.rmi.Naming;99 import java.util.List;100 import rmi.model.PersonEntity;101 import rmi.service.*;102 public class Program 103 public static void main(String args) 104 try 105 /调用远程对象,注意RMI路径与接口必须与服务器配置一致 106 PersonService personService=(
14、PersonService)Naming.lookup(107 List 此接口包含IDL接口的Java版本。它继承自org.omg.CORBA.Object,提供标准的CORBA对象功能。 BillingHelper.java 此类提供辅助功能,Helper类负责读写数据类型到CORBA流,以及插入和提取数据类型。 BillingHolder.java This final class holds a public instance member of type Billing. BillingOperations.java 此接口包含successBilling()和shutdown()方
15、法。 BillingPOA.java 此抽象类是基于流的服务器Skeleton,为服务器提供基本的CORBA功能。它继承org.omg.PortableServer.Servant, 实现了InvokeHandler接口和BillingOperations接口。服务器类BillingServant继承BillingPOA。 _BillingStub.java 此类是客户端stub,为客户端提供CORBA功能。它继承org.omg.CORBA.Object,提供标准CORBA对象功能。还扩展了 BillingOperations接口和org.omg.CORBA.portable.IDLEntit
16、y接口。3)实现服务器端一旦使用idlj编译器后,就可以使用它产生的Skeleton装配服务器应用程序了。另外要实现远程接口方法,服务器代码应包含启动ORB和等待远程客户端调用的机制。服务器端由两个类组成,一个是servant,另一个是Server。servant是BillingImpl类,是Billing IDL接口的实现,每个Billing实例均由BillingImpl实例实现。servant是BillingPOA的子类。servant包含了IDL定义的所有方法,与通常的Java方法类似。server类含服务器的main()方法,它: 创建和初始化ORB实例 获得根POA的引用并激活POA
17、Manager 创建一个Servant实例(CORBA的Billing对象的实现)并通知ORB 获得根命名上下文 在命名上下文用“Billing”名注册新对象 等待客户端调用此新对象【BillingImpl.java源码】:124 import org.omg.CORBA.ORB;125 import BillingApp.*;126 class BillingImpl extends BillingPOA 127 private ORB orb;128 public void setORB(ORB orb_val) 129 this.orb = orb_val;130 131 132 public String successBilling() 133 return nBilling success!n;134 135 136 public void shutdown() 137 orb.shutdown(false);138 139 【BillingServer.java源码】:140 import org.omg.CORBA.ORB;141 import org.omg.CosNaming.NameComponent;142 import org.omg.CosNaming.Nam
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1