betacode

Java Удаленный вызов методов - Java RMI

  1. Введение
  2. Создать project
  3. Запуск приложения

1. Введение

RMI - это способ, которым вы можете вызывать метод (method) удаленно. Например, вызвать метод, запущенный на компьютере B, и получить возвращенный результат. Таким образом, компьютер B является сервером, предоставляющим услугу.

2. Создать project

Создать новый проект с названием RMITutorial
Это модель классов, упакованные для Client и Server:
Это рабочая модель RMI. Сервер зарегистрирует объект в Registry. Затем клиент будет искать Registry по IP-адресу и порту (Host + Port), чтобы он мог вызывать методы (method) из объектов на Сервере.
Constants.java
package org.o7planning.tutorial.rmi;

public class Constants {

 
   public static final String LOCATION_HANOI = "HaNoi";    
   public static final String LOCATION_TOKYO = "Tokyo";
   public static final String LOCATION_CHICAGO = "Chicago";
   
   
 
   public static final String WEATHER_RAIN ="rain";
   
 
   public static final String WEATHER_SUNNY ="sunny";

}
WeatherData.java
package org.o7planning.tutorial.rmi;

import java.io.Serializable;
import java.util.Date;

public class WeatherData implements Serializable {

   private static final long serialVersionUID = 1L;

   private Date date;
   private String location;
   private String weather;

   public WeatherData(Date date, String location, String weather) {
       this.date = date;
       this.location = location;
       this.weather = weather;
   }

   public Date getDate() {
       return date;
   }

   public void setDate(Date date) {
       this.date = date;
   }

   public String getLocation() {
       return location;
   }

   public void setLocation(String location) {
       this.location = location;
   }

   public String getWeather() {
       return weather;
   }

   public void setWeather(String weather) {
       this.weather = weather;
   }

}
WeatherService.java
package org.o7planning.tutorial.rmi;

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



public interface WeatherService extends Remote {
 
  // Method to retrieve weather information.
  public WeatherData getWeather(Date date, String location)
          throws RemoteException;
}
WeatherServiceImpl.java
package org.o7planning.tutorial.rmi.server;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Calendar;
import java.util.Date;

import org.o7planning.tutorial.rmi.Constants;
import org.o7planning.tutorial.rmi.WeatherData;
import org.o7planning.tutorial.rmi.WeatherService;

public class WeatherServiceImpl extends UnicastRemoteObject implements
      WeatherService {
  private static final long serialVersionUID = 1L;

  public WeatherServiceImpl() throws RemoteException {
      super();
  }

  @Override
  public synchronized WeatherData getWeather(Date date, String location)
          throws RemoteException {
      Calendar c = Calendar.getInstance();
      c.setTime(date);

      int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);

      // Sunday, Monday
      if (dayOfWeek == 1 || dayOfWeek == 2) {
          if (location.equals(Constants.LOCATION_CHICAGO)) {
              // Rain
              return new WeatherData(date, location, Constants.WEATHER_RAIN);
          } else if (location.equals(Constants.LOCATION_HANOI)) {
              // Sunny
              return new WeatherData(date, location, Constants.WEATHER_SUNNY);
          } else if (location.equals(Constants.LOCATION_TOKYO)) {
              // Sunny
              return new WeatherData(date, location, Constants.WEATHER_SUNNY);
          }
          return new WeatherData(date, location, Constants.WEATHER_SUNNY);
      } else {
          return new WeatherData(date, location, Constants.WEATHER_SUNNY);
      }

  }
}
Client.java
package org.o7planning.tutorial.rmi.client;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.Date;

import org.o7planning.tutorial.rmi.Constants;
import org.o7planning.tutorial.rmi.WeatherData;
import org.o7planning.tutorial.rmi.WeatherService;

public class Client {

   // Host or IP of Server
   private static final String HOST = "localhost";
   private static final int PORT = 1099;
   private static Registry registry;

   public static void main(String[] args) throws Exception {

       // Search the registry in the specific Host, Port.
       registry = LocateRegistry.getRegistry(HOST, PORT);

       // Lookup WeatherService in the Registry.
       WeatherService service = (WeatherService) registry
               .lookup(WeatherService.class.getSimpleName());

       Date today = new Date();

       // Get Chicago weather info:
       WeatherData chicagoWeather = service.getWeather(today,
               Constants.LOCATION_CHICAGO);

       System.out.println("Chicago weather today: "
               + chicagoWeather.getWeather());
       
       // Get Hanoi weather info:
       WeatherData hanoiWeather = service.getWeather(today,
               Constants.LOCATION_HANOI);

       System.out.println("Hanoi weather today: " + hanoiWeather.getWeather());

   }
}
Server.java
package org.o7planning.tutorial.rmi.server;

import java.rmi.AlreadyBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

import org.o7planning.tutorial.rmi.WeatherService;

public class Server {
   private static final int PORT = 1099;
   private static Registry registry;

   public static void startRegistry() throws RemoteException {
       // Create server registry
       registry =  LocateRegistry.createRegistry(PORT);
   }

   public static void registerObject(String name, Remote remoteObj)
           throws RemoteException, AlreadyBoundException {

       // Bind the object in the registry.
       // It is bind with certain name.
       // Client will lookup on the registration of the name to get object.        
       registry.bind(name, remoteObj);
       System.out.println("Registered: " + name + " -> "
               + remoteObj.getClass().getName() + "[" + remoteObj + "]");
   }

   public static void main(String[] args) throws Exception {
       System.out.println("Server starting...");
       startRegistry();
       registerObject(WeatherService.class.getSimpleName(), new WeatherServiceImpl());

       // Server was the start, and was listening to the request from the client.
       System.out.println("Server started!");
   }
}

3. Запуск приложения

Чтобы запустить приложение выше, вам необходимо упаковать проект в два файла jar. Первый файл jar включает классы для запуска на клиентской машине. И второй файл Jar, включая классы для запуска на сервере.
Это иллюстрация:
Тем не менее, вы можете запустить Demo на Eclipse:
Сначала запустите класс Server:
Server starting...
Registered: WeatherService -> org.o7planning.tutorial.rmi.server.WeatherServiceImpl[WeatherServiceImpl[UnicastServerRef [liveRef: [endpoint:[192.168.0.102:64865](local),objID:[6aadac58:179707abf4c:-7fff, -728182817779393915]]]]]
Server started!
Сервер запущен, и он зарегистрировал Remote Object в Registry. Затем вы запустите class в Client.
Chicago weather today: sunny
Hanoi weather today: sunny

Java Basic

Show More