基于RMI实现远程聊天功能的简单例子

先了解一下项目结构

编译过后的项目


详细了解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

首先启动服务器:


 




打开一个客户端




再打开一个客户端

基于RMI实现远程聊天功能的简单例子_第1张图片





再打开一个客户端

基于RMI实现远程聊天功能的简单例子_第2张图片


 


解释说明:

如果在dos中可以编译但不能运行,那是路径或者是环境变量没有配置好。具体解决办法请参考:

在classspath下加入.;试试。网上有具体的解决办法请参考http://wenku.baidu.com/link?url=LH6GWsDxJemiPvhB28IKfMnwlgsfC4R7w6_ieyHlFnKo7drVJY53TX61Y_npZYfu2b2_0VlVdsj1smRRg3HSadXJVkbH7kHTBd74mcNvndK


 




你可能感兴趣的:(基于RMI实现远程聊天功能的简单例子)