基于RMI实现远程聊天功能的简单例子
2015-11-16 22:32
543 查看
先了解一下项目结构
编译过后的项目:
详细了解java文件:
客户端接口Client.java
客户端实现类:RMIClient.java
import java.io.BufferedReader;
服务器接口Server.java
服务器实现类ServerImpl.java
运行说明:
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
编译过后的项目:
详细了解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
相关文章推荐
- VirtualPathProvider的使用
- 线程安全
- 从巴黎的恐怖袭击看以色列如何用大数据进行反恐
- POI操作Excel设置前景色背景色
- POI操作Excel设置前景色背景色
- POI操作Excel设置前景色背景色
- 好用的vimrc
- 1029 Median
- 夯实JAVA基本之一 —— 泛型详解(1):基本使用
- 使用ListView时的几个BUG与相应的优化
- Android平板上开发应用的一点心得——精确适配不同的dpi和屏幕尺寸
- 2015年11月16日
- hdu 1022 Train Problem I(栈的模拟)
- 在.NET开发中的单元测试工具之(1)——NUnit
- UI 第五天 代理设计模式 手势识别器
- 20135203齐岳信息安全系统设计基础——实验一实验报告
- 自动填充短信验证码(使用ContentObserver)
- garch matlab
- 10月月赛
- linux下rsync的配置以实现文件夹的同步及常见error总结