Очень простой способ позволить двум Java-приложениям (серверу и клиенту) разговаривать друг с другом, особенно на том же компьютере, использовать Remote Method Invocation (RMI). RMI позволяет обмениваться объектами между Java-приложениями, что означает, что это очень высокий уровень абстракции связи и устраняет необходимость писать пользовательский сетевой код или обрабатывать задействованный параллелизм.
Вот очень простой пример:
Шаг 1: Создание общего интерфейса
Создать общий интерфейс, который описывает функциональные возможности, предоставляемые го сервера:
package com.example.remote;
import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface RemoteControlInterface extends Remote, Serializable {
public void sendCommand(String command) throws RemoteException;
}
Этот интерфейс должен расширять java.rmi.Remote
и java.io.Serializable
, и каждый метр должен быть способен выбросить java.rmi.RemoteException
. Поместите это в библиотеку и используйте эту библиотеку как на сервере, так и на клиенте. Как это делается, зависит от используемой среды IDE. Самый простой способ - разместить сервер, клиент и общую библиотеку в одном проекте.
Шаг 2: Создание приложения сервера
Создать реализацию общего интерфейса приложения сервера:
package com.example.remote.server;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import com.example.remote.RemoteControlInterface;
public class RemoteControl extends UnicastRemoteObject implements RemoteControlInterface {
private static final long serialVersionUID = 1L;
protected RemoteControl() throws RemoteException {
}
@Override
public void sendCommand(String command) throws RemoteException {
System.out.println("remote control asked for " + command);
}
}
Осуществление общего интерфейса должно распространяться java.rmi.server.UnicastRemoteObject
.
Создайте фактическое серверное приложение, которое публикует экземпляр реализации RemoteControlInterface
как remoteControl
в качестве сервера, который прослушивает порт 1234
.
package com.example.remote.server;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class Server {
public static void main(String[] args) throws MalformedURLException, RemoteException, AlreadyBoundException {
Registry registry = LocateRegistry.createRegistry(1234);
registry.bind("remoteControl", new RemoteControl());
}
}
Шаг 3: Создание клиентского приложения
Создать фактическое клиентское приложение, которое подключается к серверу на порт 1234
и извлекающий опубликованный экземпляр RemoteControlInterface
, используя имя remoteControl
.
package com.example.remote.client;
import java.rmi.AccessException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import com.example.remote.RemoteControlInterface;
public class Client {
public static void main(String[] args) throws AccessException, RemoteException, NotBoundException {
Registry registry = LocateRegistry.getRegistry(1234);
RemoteControlInterface greetingService = (RemoteControlInterface) registry.lookup("remoteControl");
greetingService.sendCommand("helloWorld");
}
}
Это заставит сервер приложений для печати remote control asked for helloWorld
на своей консоли.
параметры и возвращаемое значение из всех методов в общий интерфейс может быть:
- Любой примитивный тип Java (булево, INT, ...)
- Любой класс, доля оба приложения (String , Date, ...), который реализует
java.io.Serializable
, если оба приложения имеют одну и ту же версию соответствующего файла класса. Письмо верно для всех классов, предоставляемых JRE, и всех классов, помещенных в общую библиотеку.
Хотя RMI может сделать гораздо больше, этого должно быть достаточно для реализации простого пульта дистанционного управления.
Посмотрите на этот вопрос и ссылку в этом вопросе: http://stackoverflow.com/questions/33106127/swift-socket-readline-writeline/33106252#33106252 & http://cs.lmu.edu/~ ray/notes/javanetexamples/ –
Эта ссылка была бы более понятной: http://stackoverflow.com/questions/32486607/java-socket-remote-desktop-connection/32487098#32487098 –