关于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 (不需要积分)

目录
相关文章
|
2月前
|
Java
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
文章详细解释了Java关键字`super`的用途,包括访问父类的成员变量、调用父类的构造方法和方法,并提供了相应的代码实例。
127 5
Java关键字 —— super 详细解释!一看就懂 有代码实例运行!
|
26天前
|
存储 NoSQL Java
Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
【10月更文挑战第29天】Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
69 1
|
2月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
64 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
2月前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
2月前
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
45 2
|
2月前
|
存储 Java 数据安全/隐私保护
Java中的域,什么是域?计算机语言中的域是什么?(有代码实例)
文章解释了Java中域的概念,包括实例域、静态域、常量域和局部域,以及它们的特点和使用场景。
65 2
|
2月前
|
Java
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
本文介绍了Java中this和super关键字的用法,包括在构造方法中使用this来区分参数和成员变量、使用super调用父类构造方法和方法,以及它们在同一个方法中同时使用的场景。
131 0
Java关键字 —— super 与 this 详细解释!一看就懂 有代码实例运行!
|
2月前
|
Java
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
这篇文章详细解释了Java中static和final关键字的用法,包括它们修饰类、方法、变量和代码块时的行为,并通过代码示例展示了它们的具体应用。
213 0
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
|
3月前
|
存储 Java
Java之静态(static)与实例(instance)
Java之静态(static)与实例(instance)
|
2月前
|
NoSQL Java 数据库
Java分布式锁
Java分布式锁
40 0