先了解一下项目结构
编译过后的项目:
详细了解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