Docker e socket java: condividi i dati tra i contenitori

Jan 11 2021

Sto codificando un servizio client-server in cui il mio server invia file al client.

Nell'esempio seguente, ho provato a inviare un elenco di nomi di file al mio client.

server

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();

Cliente

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++;
}

Quindi quando eseguo il mio programma su java NetBeans IDE funziona come voglio. Ottengo i file

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

Per la connessione docker ho creato una rete con

docker network create client_server_network

Corro il server con

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

e il cliente con

docker run --network client_server_network -it clientimage

Sebbene la connessione client-server abbia esito positivo tramite i contenitori Docker, quando eseguo entrambi i servizi non ottengo alcun output.

<---Available files--->

Sono bloccato in questo per giorni. Cosa potrebbe esserci di sbagliato? Se dovessi fornire altre informazioni, per favore dimmelo.

PS sul lato server della finestra mobile ho impostato l' immagine del server come hostnewclientSocket = new Socket("server", 4000)

Risposte

Ruokki Jan 11 2021 at 16:48

Il container ha il proprio file system diverso dal file system host. Il tuo percorso C:\ServerMusicStoragenon può funzionare nel tuo contenitore perché questo file non è nel tuo contenitore.

Dovresti dare un'occhiata per legare o volume

O copiare il file durante la creazione dell'immagine.

Inoltre il tuo percorsoèun percorso di Windows dovresti cambiarlo per un percorso unix (/ tuadirectory) perché la maggior parte delle immagini docker sono di sistema Linux

Se vuoi usare COPY nel tuo DockerFile basta aggiungere

COPY ServerMusicStorage/ /ServerMusicStorage 

Ma se non sbaglio il file src dovrebbe essere un percorso relativo ... correlato a Quindi devi mettere / ServerMusicStorage vicino alla tua directory di compilazione