Сокеты Docker и java: обмен данными между контейнерами

Jan 11 2021

Я кодирую службу клиент-сервер, где мой сервер отправляет файлы клиенту.

В следующем примере я попытался отправить своему клиенту список имен файлов.

Сервер

serverSocket = new ServerSocket(4000);
connsock = serverSocket.accept();
objectOutput = new ObjectOutputStream(connsock.getOutputStream());

List<String> file_names = new ArrayList<String>();
File[] files = new File("C:\\ServerMusicStorage").listFiles();

for (File file : files) {
    if (file.isFile()) {
        file_names.add(file.getName());
    }
}
objectOutput.writeObject(file_names);
objectOutput.flush();

Клиент

newclientSocket = new Socket("localhost", 4000);
objectInput1 = new ObjectInputStream(newclientSocket.getInputStream());

System.out.println("<---Available files--->");

// get list of files from server
Object file_names = objectInput1.readObject();
file_list = (ArrayList<String>) file_names;
int count = 1;

for (int i = 0; i < file_list.size(); i++) {
    System.out.println(count + ")" + file_list.get(i));
    count++;
}

Поэтому, когда я запускаю свою программу в среде Java NetBeans IDE, она работает так, как я хочу. Я получаю файлы

<---Available files--->
1)blank.wav
2)fuark.wav

Для подключения докера я создал сеть с

docker network create client_server_network

Я запускаю сервер с

docker run --env SERVER_HOST_ENV=server --network-alias server --network client_server_network -it server

и клиент с

docker run --network client_server_network -it clientimage

Хотя соединение клиент-сервер проходит успешно через контейнеры докеров, когда я запускаю обе службы, я не получаю никаких выходных данных.

<---Available files--->

Я застрял в этом на несколько дней. Что может быть не так? Если мне нужно предоставить какую-либо другую информацию, пожалуйста, сообщите мне.

PS на стороне сервера докера я установил образ сервера в качестве хостаnewclientSocket = new Socket("server", 4000)

Ответы

Ruokki Jan 11 2021 at 16:48

Контейнер имеет свою собственную файловую систему, отличную от файловой системы хоста. Ваш путь C:\ServerMusicStorageне может работать в вашем контейнере, потому что этого файла нет в вашем контейнере.

Вы должны взглянуть на переплет или объем

Или копирование файла при создании своего изображения.

Также ваш путь - это путь к Windows, вы должны изменить его на путь unix (/ yourdirectory), потому что большинство изображений докеров - это система Linux.

Если вы хотите использовать COPY в своем DockerFile, просто добавьте

COPY ServerMusicStorage/ /ServerMusicStorage 

Но если я не ошибаюсь, файл src должен быть относительным путем ... связанный с Таким образом, вы должны поместить / ServerMusicStorage рядом с каталогом сборки