Как бы я сделал графический интерфейс для моего клиент-серверного приложения RMI? - PullRequest
0 голосов
/ 13 октября 2019

Итак, я новичок в Java RMI и создаю графический интерфейс, но RMI работает. Теперь у меня есть класс Interface с именем MessageService, класс Server с именем MessageServer и класс Client с именем MessageClient. Я хотел бы сделать графический интерфейс с полем, где я могу написать сообщение, которое затем будет отображаться на стороне сервера. Как это достигается?

РЕДАКТИРОВАТЬ: Я сейчас сделал какой-то графический интерфейс. Я также добавил функцию на сервер. Я также отредактировал код клиента, чтобы при запуске он запускал мой класс графического интерфейса.

Как бы я это реализовал, чтобы я мог писать текст в поле ввода, и при отправке он будет виден на сервере?

Вот код для GUI:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.*;
import javafx.stage.Stage;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;

public class TheGUI extends Application{

    Button sendButton;
    TextField input;

    public static void main(String[] args) throws RemoteException, NotBoundException {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("GUI");

        input = new TextField();
        sendButton = new Button();

        sendButton.setText("send");

        AnchorPane layout = new AnchorPane();

        HBox hbox = new HBox(5, input, sendButton);
        layout.getChildren().addAll(hbox);
        AnchorPane.setTopAnchor(hbox, 10d);

        EventHandler<ActionEvent> event = new EventHandler<ActionEvent>() {
            public void handle(ActionEvent e)
            {
                String message = input.getText();
                input.setText("");

            }
        };

        input.setOnAction(event);
        sendButton.setOnAction(event);

        Scene scene = new Scene(layout, 300, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

Это мой отредактированный интерфейс:

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface MessageService extends Remote {
    public void newMessage (String clientID, String message) throws RemoteException;
}

Это мой отредактированный класс сервера:

import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;

public class MessageServer extends UnicastRemoteObject implements MessageService {

    protected MessageServer() throws RemoteException {
        super();
    }

    @Override
    public void newMessage(String clientID, String message) throws RemoteException {
        System.out.println(clientID + " " + message);
    }

    public static void main (String[] argv)
    {
        try
        {
            Registry registry = LocateRegistry.getRegistry(1099);
            MessageServer messageServer = new MessageServer();
            registry.rebind("MessageService", messageServer); //register with naming service(bind with registry)
            System.out.println("Server is Ready");
        }
        catch (RemoteException e)
        {
            System.out.println("ERROR: Could not create registry");
            e.printStackTrace();
        }


    }
}

Это мой отредактированный класс клиента:

import javafx.application.Application;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class MessageClient
{
    public static void main (String[] argv) throws RemoteException, NotBoundException {
        try
        {
            Registry registry = LocateRegistry.getRegistry("127.0.0.1");
            MessageService messageService= (MessageService) registry.lookup("MessageService");
            Application.launch(TheGUI.class);
        }
        catch (Exception e)
        {
            System.out.println ("MessageClient exception: " + e);
        }
    }
}

1 Ответ

1 голос
/ 14 октября 2019

Вы очень близки. Ваш код почти завершен.

RMI означает связь между двумя отдельными JVM. Первая JVM - это ваш серверный процесс, для которого вы завершили кодирование, поэтому я не буду повторять его здесь. Вторая JVM - это ваш клиентский процесс. Вы можете комбинировать код GUI с кодом клиента RMI. И код GUI, который вы разместили, может быть упрощен.

Вот моя версия вашего желаемого GUI для работы в качестве клиента RMI.

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

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class MessageClientGui extends Application {
    private static final String CLIENT_ID = "George";

    private static MessageService msgService;

    private TextField message;

    @Override
    public void start(Stage primaryStage) throws Exception {
        Label prompt = new Label("Message");
        message = new TextField();
        Button send = new Button("_Send");
        send.setOnAction(this::sendMessage);
        send.setTooltip(new Tooltip("Sends message to [RMI] server."));
        HBox root = new HBox(5.0D, prompt, message, send);
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void sendMessage(ActionEvent actnEvnt) {
        try {
            msgService.newMessage(CLIENT_ID, message.getText());
        }
        catch (RemoteException x) {
            x.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try {
            Registry registry = LocateRegistry.getRegistry("127.0.0.1");
            msgService = (MessageService) registry.lookup("MessageService");
            launch(args);
        }
        catch (Exception x) {
            x.printStackTrace();
        }
    }
}

Вот изображение работающего клиента.

RMI GUI Client

В методе main() я инициализирую клиента MessageService и сохраняю его в статической переменной-члене класса. Когда пользователь нажимает кнопку Отправить , вызывается метод sendMessage(). В этом методе удаленный метод newMessage() вызывается с содержимым TextField и некоторым произвольным идентификатором клиента, а именно Джорджем. В результате в консоли (то есть стандартном выводе) серверной JVM выводится строка, которая начинается с: George

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...