您的位置:首页 > 其它

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

2015-11-16 22:32 543 查看
先了解一下项目结构

编译过后的项目:







详细了解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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: