Sockets Docker et Java: partagez des données entre des conteneurs

Jan 11 2021

Je suis en train de coder un service client-serveur où mon serveur envoie des fichiers au client.

Dans l'exemple suivant, j'ai essayé d'envoyer une liste de noms de fichiers à mon client.

Serveur

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

Client

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

Ainsi, lorsque j'exécute mon programme sur java NetBeans IDE, cela fonctionne comme je le souhaite. Je reçois les fichiers

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

Pour la connexion docker, j'ai créé un réseau avec

docker network create client_server_network

Je lance le serveur avec

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

et le client avec

docker run --network client_server_network -it clientimage

Bien que la connexion client-serveur soit réussie via des conteneurs docker, lorsque j'exécute les deux services, je n'obtiens aucune sortie.

<---Available files--->

Je suis coincé là-dedans pendant des jours. Qu'est-ce qui ne va pas? Si je devais fournir d'autres informations, veuillez me le dire.

PS du côté serveur du docker, j'ai défini l' image du serveur comme hôtenewclientSocket = new Socket("server", 4000)

Réponses

Ruokki Jan 11 2021 at 16:48

Le conteneur a son propre système de fichiers différent du système de fichiers hôte. Votre chemin C:\ServerMusicStoragene peut pas fonctionner dans votre conteneur car ce fichier ne se trouve pas dans votre conteneur.

Vous devriez jeter un oeil à la liaison ou au volume

Ou copiez le fichier lors de la création de votre image.

De plus, votre chemin est un chemin Windows, vous devez le changer pour un chemin unix (/ votre répertoire) car la plupart des images docker sont du système Linux

Si vous souhaitez utiliser COPY dans votre DockerFile, ajoutez simplement

COPY ServerMusicStorage/ /ServerMusicStorage 

Mais si je ne me trompe pas, le fichier src doit être un chemin relatif ... lié à Vous devez donc placer / ServerMusicStorage près de votre répertoire de construction