ซ็อกเก็ต 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--->

ฉันติดอยู่ในนี้หลายวัน อาจจะผิดพลาดอะไร หากฉันควรให้ข้อมูลอื่น ๆ โปรดบอกฉัน

ปล. ที่ฝั่งเซิร์ฟเวอร์ของนักเทียบท่าฉันตั้งค่าอิมเมจเซิร์ฟเวอร์เป็นโฮสต์newclientSocket = new Socket("server", 4000)

คำตอบ

Ruokki Jan 11 2021 at 16:48

คอนเทนเนอร์มีระบบไฟล์ของตัวเองแตกต่างจากระบบไฟล์โฮสต์ เส้นทางของคุณC:\ServerMusicStorageไม่สามารถทำงานในคอนเทนเนอร์ของคุณได้เนื่องจากไฟล์นี้ไม่ได้อยู่ในคอนเทนเนอร์ของคุณ

คุณควรดูการผูกหรือปรับระดับเสียง

หรือคัดลอกไฟล์เมื่อสร้างภาพของคุณ

นอกจากนี้เส้นทางของคุณยังเป็นเส้นทางของ windows ที่คุณควรเปลี่ยนเป็นเส้นทาง unix (/ yourdirectory) เนื่องจากภาพนักเทียบท่าส่วนใหญ่เป็นระบบลินุกซ์

หากคุณต้องการใช้COPYใน DockerFile ของคุณเพียงแค่เพิ่ม

COPY ServerMusicStorage/ /ServerMusicStorage 

แต่ถ้าฉันไม่เข้าใจผิดไฟล์ src ควรเป็นพา ธ สัมพัทธ์ ... เกี่ยวข้องกับดังนั้นคุณต้องใส่ / ServerMusicStorage ใกล้กับ build dir ของคุณ