Подтвердить что ты не робот

Java-клиент/серверное приложение с сокетами?

Я пишу пакет java, который будет вызываться другим языком (matlab). Если мой matlab-процесс завершается, я хочу, чтобы процесс Java продолжал работать. Всякий раз, когда MATLAB запускается снова, он должен иметь возможность общаться с существующим ходом. Поэтому я думаю, что мне нужно, чтобы приложение Java связывалось через сокеты в модели клиент/сервер. Я представляю себе простой набор функций:

  • startServer (хост, порт)
  • runCommand (сервер, команда...)
  • stopServer (хост, порт)

Я никогда раньше ничего подобного не делал. Думаю ли я об этом правильно, или есть более простой способ создания приложения, которое может запускаться независимо от его родительского процесса? Какой лучший современный способ сделать это (например, есть ли хорошие пакеты Apache)? Может ли кто-нибудь предоставить простое демо или указать мне учебник по общению с процессом через сокеты?

[Edit] Для некоторых пояснений, Matlab может создать экземпляр java-объекта и запустить Java-код внутри себя. Таким образом, функция startServer() в matlab будет запускать Java-код, который будет проверять, если java-процесс уже запущен на этом порту, а если нет, запустите процесс сервера.

Я не привязан к использованию сокетов любыми способами (в случае, если это не очевидно, я в основном разработчик Matlab), поэтому, если там что-то проще, я все для этого. Мне просто нужно иметь возможность запускать вещи независимо от Matlab, но Matlab управляет этими процессами (через java).

4b9b3361

Ответ 1

Сервер прослушивает соединение. Когда соединение устанавливается клиентом. Клиент может отправлять данные. В текущем примере клиент отправляет сообщение "Привет, мой сервер". Чтобы завершить соединение, клиент отправляет сообщение "пока". Затем сервер отправляет сообщение "bye" тоже. Наконец, соединение завершено, и сервер ждет другого соединения. Обе программы должны работать на одном компьютере. однако, если вы хотите запустить их на двух разных машинах, вы можете просто изменить адрес "localhost" на IP-адрес машины, на которой вы запустите сервер.

Сервер

import java.io.*;
import java.net.*;
public class Provider{
    ServerSocket providerSocket;
    Socket connection = null;
    ObjectOutputStream out;
    ObjectInputStream in;
    String message;
    Provider(){}
    void run()
    {
        try{
            //1. creating a server socket
            providerSocket = new ServerSocket(2004, 10);
            //2. Wait for connection
            System.out.println("Waiting for connection");
            connection = providerSocket.accept();
            System.out.println("Connection received from " + connection.getInetAddress().getHostName());
            //3. get Input and Output streams
            out = new ObjectOutputStream(connection.getOutputStream());
            out.flush();
            in = new ObjectInputStream(connection.getInputStream());
            sendMessage("Connection successful");
            //4. The two parts communicate via the input and output streams
            do{
                try{
                    message = (String)in.readObject();
                    System.out.println("client>" + message);
                    if (message.equals("bye"))
                        sendMessage("bye");
                }
                catch(ClassNotFoundException classnot){
                    System.err.println("Data received in unknown format");
                }
            }while(!message.equals("bye"));
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
        finally{
            //4: Closing connection
            try{
                in.close();
                out.close();
                providerSocket.close();
            }
            catch(IOException ioException){
                ioException.printStackTrace();
            }
        }
    }
    void sendMessage(String msg)
    {
        try{
            out.writeObject(msg);
            out.flush();
            System.out.println("server>" + msg);
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
    }
    public static void main(String args[])
    {
        Provider server = new Provider();
        while(true){
            server.run();
        }
    }
}

Клиент

import java.io.*;
import java.net.*;
public class Requester{
    Socket requestSocket;
    ObjectOutputStream out;
    ObjectInputStream in;
    String message;
    Requester(){}
    void run()
    {
        try{
            //1. creating a socket to connect to the server
            requestSocket = new Socket("localhost", 2004);
            System.out.println("Connected to localhost in port 2004");
            //2. get Input and Output streams
            out = new ObjectOutputStream(requestSocket.getOutputStream());
            out.flush();
            in = new ObjectInputStream(requestSocket.getInputStream());
            //3: Communicating with the server
            do{
                try{
                    message = (String)in.readObject();
                    System.out.println("server>" + message);
                    sendMessage("Hi my server");
                    message = "bye";
                    sendMessage(message);
                }
                catch(ClassNotFoundException classNot){
                    System.err.println("data received in unknown format");
                }
            }while(!message.equals("bye"));
        }
        catch(UnknownHostException unknownHost){
            System.err.println("You are trying to connect to an unknown host!");
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
        finally{
            //4: Closing connection
            try{
                in.close();
                out.close();
                requestSocket.close();
            }
            catch(IOException ioException){
                ioException.printStackTrace();
            }
        }
    }
    void sendMessage(String msg)
    {
        try{
            out.writeObject(msg);
            out.flush();
            System.out.println("client>" + msg);
        }
        catch(IOException ioException){
            ioException.printStackTrace();
        }
    }
    public static void main(String args[])
    {
        Requester client = new Requester();
        client.run();
    }
}

Ответ 2

Похоже, вам нужно, чтобы процесс сервера Java не зависел от процесса Matlab. Поэтому, когда процесс Matlab запускается/останавливается, сервер Java продолжается. Сервер Java будет сидеть и ждать входящих соединений, а также обрабатывать несколько подключений, отключать и т.д.

Здесь учебник для написания сервера сокетов Java (обратите внимание, что он является частью более крупного учебника по обмену сокетами клиент/сервер Java).

Одна из задач, с которой вы столкнетесь (и я не могу помочь вам здесь стать Matlab-unaware), создает или использует независимые от платформы средства для создания фактического сообщения, будь то использование двоичного представления XML (похоже, что Matlab имеет некоторые функции XML) или другие.

Ответ 3

Если вы решите пойти с настраиваемым протоколом уровня сокета, я могу предложить вам использовать JBoss Netty в конце java:

Другими словами, Netty является клиентом NIO сервер, который позволяет быстро и легкое развитие сети приложения, такие как серверы протоколов и клиентов. Это значительно упрощает и упрощает сетевое программирование как сервер сокетов TCP и UDP.

Ответ 4

Если, как вы говорите, Matlab может запускать Java-код изнутри самого себя, тогда не должно быть причин, по которым вы не можете использовать RMI для связи между сервером Matlab и Java. RMI намного проще, чем программирование сокетов.

Ответ 5

Легкая часть - это учебник: Учебник по солнечным сокетам научил меня всему, что мне нужно знать о программировании сокетов, и, надеюсь, сделаем для вас тоже.

Я думаю, вам нужно прояснить свое мнение о командах, которые вы хотите поддержать, в частности, о первом и третьем:

  • Если процесс Java не запущен, кто будет отвечать на вашу команду startServer? И если он работает, кому это нужно?:)

  • Вы можете, конечно, реализовать команду stopServer. Но это было бы похоже на то, что ваш компьютер вытаскивал свой собственный шнур питания из стены. Мы вернемся к предыдущему вопросу: если сервер остановился, кто услышит команду запуска?

Как я понимаю, единственная удаленная операция, в которой вы нуждаетесь, является средней.

Однако... программирование сокетов - только умеренно весело. Вы можете рассмотреть учебник RMI для альтернативы.

Ответ 6

Любая причина, по которой вы не можете просто реализовать свой Java-сервер в виде набора сервлетов в tomcat? Tomcat поставляется со всеми инструментами для автозапуска и поддержания работы сервера, вы можете довольно легко реализовать SOAP-сервис или веб-службы RESTful, что поможет отделить ваш код matlab от вашего Java-кода.