關於java RMI分布式程式開發執行個體

來源:互聯網
上載者:User

關於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個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.