Как мне подключить 2 приложения сервера Java websocket в Docker? - PullRequest
1 голос
/ 10 апреля 2019

У меня есть 2 приложения Java Spring Boot, которые я подключаю через локальный порт 81. Код в порядке, как он работает в Eclipse. Когда я использую докер, я пытаюсь выставить порты, и это терпит неудачу. Не удается подключить образы док-станции друг к другу в двух отдельных терминалах док-станции.

Код сервера:

public static void main(String[] args) {
        SpringApplication.run(SpringGetApplication.class, args);
        try {
            final int portNumber = 81;
            ServerSocket serverSocket = new ServerSocket(portNumber);

            while (true) {
                // SOCKET MESSAGE SENDER
                // SOCKET SENDS MESSAGE THEN CLOSES
                Socket socket = serverSocket.accept();
                OutputStream os = socket.getOutputStream();
                PrintWriter pw = new PrintWriter(os, true);

                // PW, PRINTWRITER SENDS STRINGS TO OTHER SERVER
                pw.println("Hello");

                // BUFFEREDREADER READS OTHER SERVER'S MESSAGES
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                // WHILE LOOP TO KEEP READING LINE WHEN THE INPUTS ARE COMING
                String answer = null;
                while ((answer = br.readLine()) != null) {
                    System.out.println(answer);
                }

                pw.println("I HAVE SUCCESSFULLY RECIEVED YOUR DATA");
                pw.close();
                br.close();
            }
        } catch (Exception e) {     }
    }

Код клиента:

public static void main(String[] args) {
        SpringApplication.run(SpringGetApplication.class, args);

        try {
            final String host = "localhost";
            final int portNumber = 81;

            System.out.println("Creating server socket on port " + portNumber);
            Socket socket = new Socket(host, portNumber);

            // READS RESPONSE FROM THE SERVER
            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            // PRINTWRITER USES SOCKET OUTPUT TO SEND THE DATA OUT TO THE OTHER SERVER
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            System.out.println("server says:" + br.readLine());

            String outputTextToCC = "HOWDY THERE, i'M THE CLIENT";
            // OUT SENDS THE STRING TO THE OTHER SERVER
            out.println(outputTextToCC);
            out.println("FINISH");

            // READS RESPONSE FROM OTHER SERVER
            System.out.println("server says:" + br.readLine());
            br.close();
            socket.close();

        } catch (Exception e) {     }
    }

Я создал образы Docker для них обоих и запускаю 2 образа на отдельных терминалах Docker.

  • Терминал 1 (приложение My Server): docker run --expose=81 contactcentre2
  • Терминал 2 (приложение My Client): docker run --expose=81 contactcentretest

enter image description here

Я попытался открыть порт 81, но мое клиентское приложение все еще не может подключиться к другому серверу.

1 Ответ

2 голосов
/ 10 апреля 2019

Внутри вашего контейнера ваше приложение не знает, что такое "localhost".

Если вы используете сетевой IP-адрес, он будет работать.Лучше воспользуйтесь сетевым соединением или создайте:

https://docs.docker.com/v17.09/engine/userguide/networking/#the-default-bridge-network

https://docs.docker.com/compose/

Пример вы найдете здесь: https://docs.docker.com/compose/overview/

И конецс чем-то вроде этого:

version: '3'
services:
  server:
    image: server-img
    ports:
    - "81:81"
  client:
    image: client-img
    links:
    - server

Затем замените «localhost» на «server».

PS: вам не нужно выставлять порт из вашего клиента.

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