关于java RMI分布式程序开发实例

简介:

关于java RMI分布式程序开发实例

 

作者: javaboy2012
Email:yanek@163.com
qq:    1046011462

 


一. 服务器端


    接口定义:注意必须继承Remote接口


package com.yanek.rmi.server;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;

public interface ChannelManager extends Remote {
 
 public List<Channel> getChannels() throws RemoteException;

}

接口传输的对象:注意必须实现Serializable接口。


package com.yanek.rmi.server;

import java.io.Serializable;

public class Channel implements Serializable{
 
 
 private int id;
 private String name;
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Channel(int id, String name) {
  super();
  this.id = id;
  this.name = name;
 }
 

}

 


    接口实现: 注意继承UnicastRemoteObject类

package com.yanek.rmi.server;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class ChannelManagerImpl extends UnicastRemoteObject implements ChannelManager {

 /**
  *
  */
 private static final long serialVersionUID = 1L;

 /**
  * @param args
  */
 public static void main(String[] args) {
  
  
  
  try {
   ChannelManager cm=ChannelManagerImpl.getInstance();
   
   ChannelManager cm1=ChannelManagerImpl.getInstance();
   ChannelManager cm2=ChannelManagerImpl.getInstance();
   System.out.println(cm1);
   System.out.println(cm2);
   System.out.println(cm);
   
   List<Channel> channels=cm.getChannels();
   
   for(int i=0;i<channels.size();i++)
   {
    Channel c=channels.get(i);
    
    System.out.println(c.getId()+"-"+c.getName());
   }
   
  } catch (RemoteException e) {
   e.printStackTrace();
  }

 }
 
 private static final Object lock = new Object();
 private static ChannelManager instance;
 
 public static ChannelManager getInstance() throws RemoteException {
  if (instance == null) {
   synchronized (lock) {
    if (instance == null)
     instance = new ChannelManagerImpl();
   }
  }
  return instance;
 }
 
 private ChannelManagerImpl() throws RemoteException {
 }

 @Override
 public List<Channel> getChannels() throws RemoteException {
  List<Channel> channels=new ArrayList<Channel>();
  channels.add(new Channel(1,"java"));
  channels.add(new Channel(2,"php"));
  channels.add(new Channel(3,"C"));
  channels.add(new Channel(4,"ASP"));
  System.out.println(new Date()+" getChannels method called!");
  return channels;
 }

}


服务启动类:


package com.yanek.rmi.server;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

public class RMIServer {

 /**
  * @param args
  */
 public static void main(String[] args) {

  
  System.out.println("RMI Server starting ...");
  
  
  if (System.getSecurityManager() == null) {
   //System.setSecurityManager(new RMISecurityManager());
  }
  
  
  try {
   LocateRegistry.createRegistry(1099);
   try {
    Naming.rebind("ChannelManager", ChannelManagerImpl.getInstance());
   } catch (MalformedURLException e) {
    e.printStackTrace();
   }
  } catch (RemoteException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
  System.out.println("RMI Server ready...");


 }

}

将如上四个类打包为server.jar

将如上ChannelManager和Channel类打包为server_4client.jar


二. 客户端

package com.yanek.rmi.client;

import java.rmi.Naming;
import java.rmi.RMISecurityManager;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.List;

import com.yanek.rmi.server.Channel;
import com.yanek.rmi.server.ChannelManager;

public class ClientUtil {

 /**
  * @param args
  */
 public static void main(String[] args) {

  ChannelManager cm = (ChannelManager) ClientUtil.renewRMI("ChannelManager");

  List<Channel> channels;
  try {
   channels = cm.getChannels();
   
   for (int i = 0; i < channels.size(); i++) {
    Channel c = channels.get(i);

    System.out.println(c.getId() + "-" + c.getName());
   }
   
  } catch (RemoteException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 

 }

 public static Remote renewRMI(String name) {
  try {

   if (System.getSecurityManager() == null) {
    //System.setSecurityManager(new RMISecurityManager());
   }
   return Naming.lookup("rmi://192.168.136.1:1099/" + name);
  } catch (Exception re) {
   throw new IllegalStateException("bind " + name + " failure . ");
  }

 }

}

 

package com.yanek.rmi.client;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import com.yanek.rmi.server.Channel;
import com.yanek.rmi.server.ChannelManager;

public class ClientTest {

 /**
  * @param args
  */
 public static void main(String[] args) {

  
  ChannelManager cm = (ChannelManager) ClientUtil.renewRMI("ChannelManager");

  List<Channel> channels=new ArrayList<Channel>();
  try {
   channels = cm.getChannels();
   
   for (int i = 0; i < channels.size(); i++) {
    Channel c = channels.get(i);

    System.out.println(c.getId() + "-" + c.getName());
   }
   
  } catch (RemoteException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

}

将如上两个类打包为client.jar


三. 发布和部署


  服务端发布: 引用server.jar包,执行RMIServer类的Main方法

  客户端调用: 引用server_4client.jar和client.jar

 

 如下为windows下bat方式调用批处理脚本

client.bat

@echo off

set cp=config

for %%i in (lib\*.jar) do call a.bat %%i

set cp=%cp%;

echo %cp%;

java -cp %cp%  com.yanek.rmi.client.ClientTest

pause


server.bat

@echo off

set cp=config

for %%i in (lib\*.jar) do call a.bat %%i

set cp=%cp%;

echo %cp%;

java -cp %cp%  com.yanek.rmi.server.RMIServer

pause

 

辅助文件 a.bat

set cp=%cp%;%1


服务端启动截图

 

 

客户端调用:

 

 

 

 

 代码和部署文件下载地址: http://download.csdn.net/detail/5iasp/5093357 (不需要积分)

目录
相关文章
|
5月前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
177 5
|
2月前
|
安全 Java 测试技术
Java 大学期末实操项目在线图书管理系统开发实例及关键技术解析实操项目
本项目基于Spring Boot 3.0与Java 17,实现在线图书管理系统,涵盖CRUD操作、RESTful API、安全认证及单元测试,助力学生掌握现代Java开发核心技能。
93 0
|
3月前
|
人工智能 Java 开发者
【Java实例-简易计算机】使用Java实现简单的计算机案例
一个简单的Java案例——“简易计算器”,帮助编程新手快速上手。通过实现用户输入、基本逻辑运算和结果输出,学习者可以掌握变量声明、Scanner对象使用、控制流语句等关键知识点。文章分为设计思路、关键知识点、完整代码和测试运行四个部分。
121 9
【Java实例-简易计算机】使用Java实现简单的计算机案例
|
4月前
|
Java 测试技术 项目管理
【JavaEE】从 0 到 1 掌握 Maven 构建 Java 项目核心技巧 解锁 Java 项目高效管理实用实例
本文从Maven基础概念讲起,涵盖安装配置、核心概念(如POM与依赖管理)及优化技巧。结合Java Web项目实例,演示如何用Maven构建和管理项目,解决常见问题,助你高效掌握这一强大工具,提升Java开发与项目管理能力。适合初学者及进阶开发者学习。资源链接:[点此获取](https://pan.quark.cn/s/14fcf913bae6)。
142 6
|
3月前
|
Java 开发者
【Java实例-神秘年龄】用Java挑战你的直觉
我们一起走进这款款简单却充满趣味的Java小游戏——“神秘年龄”。这款游戏不仅适合编程初学者作为练习项目,也能为有一定基础的开发者提供一个轻松的编程小憩。
36 0
【Java实例-神秘年龄】用Java挑战你的直觉
|
3月前
|
Java 开发者
【Java实例-神秘硬币】用Java投掷你的幸运硬币,你是猜正还是反?
本文分享了一个简单有趣的编程案例——猜硬币正反面游戏。通过模拟抛硬币(0为正面,1为反面),用户输入猜测值,程序判断结果并输出。
101 0
【Java实例-神秘硬币】用Java投掷你的幸运硬币,你是猜正还是反?
|
3月前
|
存储 算法 Java
【Java实例-智慧牌局】Java实现赌桌上的21点
游戏规则:游戏开始时,玩家和庄家各获得两张牌,玩家可以看到自己手中的两张牌以及庄家的一张明牌。玩家需要根据手中的牌面总和,选择“要牌”(Hit)以获取更多牌,或“停牌”(Stand)停止要牌。如果玩家的牌面总和超过21点,即为爆牌,玩家立即输掉游戏。若玩家选择停牌,庄家则开始行动,其策略是当牌面总和小于17点时必须继续要牌。若庄家牌面总和超过21点,则庄家爆牌,玩家获胜。若双方均未爆牌,最终比较牌面总和,更接近21点的一方获胜;若牌面总和相同,则游戏以平局结束。
53 0
|
3月前
|
Java 开发者
【Java实例-英雄对战】Java战斗之旅,既分胜负也决生死
游戏规则:在“英雄对战”中,玩家和敌人轮流选择行动,目标是在对方生命值归零前将其击败。游戏开始时,玩家和敌人都有100生命值。每回合,玩家可以选择“攻击”,“追击”,“闪避反击”这三种行动之一。
42 0
|
3月前
|
Java
【Java实例-小兵拆炸弹】Java打造数学挑战-拆炸弹
今天,我将向大家分享一款用Java开发的控制台小案例——“小兵拆炸弹”。游戏规则:玩家需要在有限的尝试次数内解开一系列数学题,以成功拆解炸弹。游戏的目标是连续答对五道数学题,每道题都由系统随机生成。如果玩家在五次机会内成功解密,游戏胜利;否则,炸弹爆炸,游戏结束。
56 0
|
5月前
|
前端开发 JavaScript Java
【Java进阶】JavaScript电灯开关实例:从理论到实践
这个例子展示了JavaScript的基本功能,包括操作HTML元素,监听事件,以及改变元素的样式。通过学习和理解这个例子,你可以了解到JavaScript在网页中的应用,以及如何使用JavaScript来创建交互式的网页。
89 13

热门文章

最新文章