ซ็อกเก็ต Docker และ java: แชร์ข้อมูลระหว่างคอนเทนเนอร์
ฉันกำลังเข้ารหัสบริการไคลเอนต์เซิร์ฟเวอร์ที่เซิร์ฟเวอร์ของฉันกำลังส่งไฟล์ไปยังไคลเอนต์
ในตัวอย่างต่อไปนี้ฉันพยายามส่งรายชื่อไฟล์ไปยังไคลเอนต์ของฉัน
เซิร์ฟเวอร์
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)
คำตอบ
คอนเทนเนอร์มีระบบไฟล์ของตัวเองแตกต่างจากระบบไฟล์โฮสต์ เส้นทางของคุณC:\ServerMusicStorage
ไม่สามารถทำงานในคอนเทนเนอร์ของคุณได้เนื่องจากไฟล์นี้ไม่ได้อยู่ในคอนเทนเนอร์ของคุณ
คุณควรดูการผูกหรือปรับระดับเสียง
หรือคัดลอกไฟล์เมื่อสร้างภาพของคุณ
นอกจากนี้เส้นทางของคุณยังเป็นเส้นทางของ windows ที่คุณควรเปลี่ยนเป็นเส้นทาง unix (/ yourdirectory) เนื่องจากภาพนักเทียบท่าส่วนใหญ่เป็นระบบลินุกซ์
หากคุณต้องการใช้COPYใน DockerFile ของคุณเพียงแค่เพิ่ม
COPY ServerMusicStorage/ /ServerMusicStorage
แต่ถ้าฉันไม่เข้าใจผิดไฟล์ src ควรเป็นพา ธ สัมพัทธ์ ... เกี่ยวข้องกับดังนั้นคุณต้องใส่ / ServerMusicStorage ใกล้กับ build dir ของคุณ