Sockets Docker et Java: partagez des données entre des conteneurs
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
Le conteneur a son propre système de fichiers différent du système de fichiers hôte. Votre chemin C:\ServerMusicStorage
ne 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