先了解一下项目结构
编译过后的项目:
详细了解java文件:
客户端接口Client.java
import java.rmi.*; //客户端的远程服务接口同样要继承Remote public interface Client extends Remote { //定义一个允许远程调用的方法 void showDialog(String msg) throws java.rmi.RemoteException; }
客户端实现类:RMIClient.java
import java.io.BufferedReader;
import java.io.InputStreamReader; import java.rmi.Naming; import java.rmi.server.UnicastRemoteObject; import javax.swing.JOptionPane; // 因为该客户端无需暴露成远程服务,因此无需继承UnicastRemoteObject public class RMIClient implements Client { private Client client; public static void main(String[] args) throws Exception { Client client = new RMIClient(); UnicastRemoteObject.exportObject(client); Server stub = (Server) Naming.lookup("rmi://10.106.100.236:1099/luoyanchao"); // 定义键盘输入流,用于读取用户键盘输入 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line = null; while ((line = br.readLine()) != null) { // 调用远程方法时,将自身作为参数传入 stub.hello(client, line); } } // 实现允许远程调用的方法 public void showDialog(String msg) throws java.rmi.RemoteException { // 使用JOptionPane显示对话框 JOptionPane.showMessageDialog(null,msg); // System.out.println(this.client+"说"+msg); } }
服务器接口Server.java
import java.rmi.*; public interface Server extends Remote { // 定义允许远程调用的方法,第一个形参类型是Client void hello(Client client, String saying) throws Exception; }
服务器实现类ServerImpl.java
import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; import java.util.*; public class ServerImpl extends UnicastRemoteObject implements Server { // 定义一个List保存所有连接进来的客户 static List<Client> users = new ArrayList<Client>(); public ServerImpl() throws RemoteException { } // 该方法中有一个形参是Client类型 // 通过这种方式让服务器获得远程客户端对象的引用 public void hello(Client cm, String saying) throws Exception { if (!users.contains(cm)) { users.add(cm); } try { java.util.Date now = new java.util.Date(); String clientt = cm.toString(); String msg = clientt + now + saying; // 依次调用连接到该服务器的每个客户端的showDialog方法 for (Client c : users) { // 回调远程客户端方法 c.showDialog(msg); } } catch (RemoteException ex) { users.remove(cm); ex.printStackTrace(); } } public static void main(String args[]) throws Exception { // 注册RMI服务端口 LocateRegistry.createRegistry(1099); Server remote = new ServerImpl(); // 将远程服务对象绑定到指定JNDI。 Naming.rebind("rmi://10.106.100.236:1099/luoyanchao", remote); } }
运行说明:
1、编译client.java生成client.class文件
2、编译server.java生成Server.class文件
3、编译ServerImpl.java生成ServerImpl.class文件
4、编译RMIClient.java生成.class文件
5、用RMIC命令即rmic RMIClient生成代理 RMIClient_stub.class
特别注意的地方说明:
最简单的运行方式是,把这几个文件放在一块,一个文件夹里,
java文件不需要包名,路径切换到这几个文件的地址
1、首先启动服务器 java ServerImpl
2、换一个dos (快捷键Win+R) java RMIClient
首先启动服务器:
打开一个客户端
再打开一个客户端
再打开一个客户端
解释说明:
如果在dos中可以编译但不能运行,那是路径或者是环境变量没有配置好。具体解决办法请参考:
在classspath下加入.;试试。网上有具体的解决办法请参考http://wenku.baidu.com/link?url=LH6GWsDxJemiPvhB28IKfMnwlgsfC4R7w6_ieyHlFnKo7drVJY53TX61Y_npZYfu2b2_0VlVdsj1smRRg3HSadXJVkbH7kHTBd74mcNvndK