Java Удаленный вызов методов - Java RMI
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
- Настройте java compiler для обработки вашего Annotation (Annotation Processing Tool)
- Программирование на Java для группы с помощью Eclipse и SVN
- Руководство Java WeakReference
- Руководство Java PhantomReference
- Сжатие и декомпрессия в Java
- Настройка Eclipse для использования JDK вместо JRE
- Методы String.format() и printf() в Java
- Синтаксис и новые функции в Java 8
- Регулярные выражения Java
- Руководство Java Multithreading Programming
- Библиотеки Java JDBC Driver для различных типов баз данных
- Руководство Java JDBC
- Получить значения столбцов, автоматически возрастающих при вставлении (Insert) записи, используя JDBC
- Руководство Java Stream
- Руководство Java Functional Interface
- Введение в Raspberry Pi
- Руководство Java Predicate
- Абстрактный класс и Interface в Java
- Модификатор доступа (Access modifiers) в Java
- Руководство Java Enum
- Руководство Java Annotation
- Сравнение и Сортировка в Java
- Руководство Java String, StringBuffer и StringBuilder
- Обработка исключений Java - Java Exception Handling
- Руководство Java Generics
- Манипулирование файлами и каталогами в Java
- Руководство Java BiPredicate
- Руководство Java Consumer
- Руководство Java BiConsumer
- Что мне нужно для начала работы с Java?
- История Java и разница между Oracle JDK и OpenJDK
- Установить Java в Windows
- Установите Java в Ubuntu
- Установите OpenJDK в Ubuntu
- Установить Eclipse
- Установите Eclipse в Ubuntu
- Быстрое изучение Java для начинающих
- История бит и байтов в информатике
- Типы данных в java
- Битовые операции
- Команда if else в Java
- команды switch в Java
- Циклы в Java
- Массивы (Array) в Java
- JDK Javadoc в формате CHM
- Наследование и полиморфизм в Java
- Руководство Java Function
- Руководство Java BiFunction
- Пример Java encoding и decoding с использованием Apache Base64
- Руководство Java Reflection
- Java Удаленный вызов методов - Java RMI
- Руководство Программирование Java Socket
- Какую платформу я должен выбрать для разработки приложений Java Desktop?
- Руководство Java Commons IO
- Руководство Java Commons Email
- Руководство Java Commons Logging
- Понимание Java System.identityHashCode, Object.hashCode и Object.equals
- Руководство Java SoftReference
- Руководство Java Supplier
- Аспектно-ориентированное программирование Java с помощью AspectJ (AOP)
Show More
- Руководства Java Servlet/JSP
- Руководства Java Collections Framework
- Java API для HTML, XML
- Руководства Java IO
- Руководства Java Date Time
- Руководства Spring Boot
- Руководства Maven
- Руководства Gradle
- Руководства Java Web Services
- Руководства Java SWT
- Руководства JavaFX
- Руководства Oracle Java ADF
- Руководства Struts2 Framework
- Руководства Spring Cloud