Docker- und Java-Sockets: Daten zwischen Containern austauschen

Jan 11 2021

Ich codiere einen Client-Server-Dienst, bei dem mein Server Dateien an den Client sendet.

Im folgenden Beispiel habe ich versucht, eine Liste mit Dateinamen an meinen Client zu senden.

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

Klient

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

Wenn ich mein Programm mit Java NetBeans IDE ausführe , funktioniert es wie gewünscht. Ich bekomme die Dateien

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

Für die Docker-Verbindung habe ich ein Netzwerk mit erstellt

docker network create client_server_network

Ich starte den Server mit

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

und der Kunde mit

docker run --network client_server_network -it clientimage

Obwohl die Client-Server-Verbindung über Docker-Container erfolgreich ist , erhalte ich beim Ausführen beider Dienste keine Ausgabe.

<---Available files--->

Ich stecke tagelang darin fest. Was könnte falsch sein? Wenn ich weitere Informationen zur Verfügung stellen sollte, teilen Sie mir dies bitte mit.

PS Auf der Serverseite von Docker habe ich das Server- Image als Host festgelegtnewclientSocket = new Socket("server", 4000)

Antworten

Ruokki Jan 11 2021 at 16:48

Container haben ein eigenes Dateisystem, das sich vom Host-Dateisystem unterscheidet. Ihr Pfad C:\ServerMusicStoragekann in Ihrem Container nicht funktionieren, da sich diese Datei nicht in Ihrem Container befindet.

Sie sollten einen Blick auf Bindung oder Volumen werfen

Oder kopieren Sie die Datei beim Erstellen Ihres Bildes.

Außerdem ist Ihr Pfad ein Windows-Pfad, den Sie für einen Unix-Pfad (/ yourdirectory) ändern sollten, da die meisten Docker-Images Linux-Systeme sind

Wenn Sie COPY in Ihrer DockerFile verwenden möchten, fügen Sie einfach hinzu

COPY ServerMusicStorage/ /ServerMusicStorage 

Aber wenn ich mich nicht irre, sollte die src-Datei ein relativer Pfad sein ... bezogen auf Also müssen Sie / ServerMusicStorage in der Nähe Ihres Build-Verzeichnisses platzieren