डॉकर और जावा सॉकेट: कंटेनरों के बीच डेटा साझा करें
मैं एक क्लाइंट-सर्वर सेवा को कोड कर रहा हूं जहां मेरा सर्वर क्लाइंट को फाइलें भेज रहा है।
निम्नलिखित उदाहरण में, मैंने अपने क्लाइंट को फ़ाइल नामों की एक सूची भेजने की कोशिश की।
सर्वर
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++;
}
इसलिए जब मैं जावा नेटबीन्स आईडीई पर अपना कार्यक्रम चलाता हूं तो यह काम करता है जैसा मैं चाहता हूं। मुझे फाइलें मिलती हैं
<---Available files--->
1)blank.wav
2)fuark.wav
Docker कनेक्शन के लिए मैंने एक नेटवर्क बनाया है
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--->
मैं इसके लिए दिनों से अटका हूं। क्या गलत हो सकता है? अगर मुझे कोई अन्य जानकारी प्रदान करनी चाहिए तो कृपया मुझे बताएं।
Docker के सर्वर-साइड पर PS होस्ट के रूप में सर्वर इमेज सेट करता हैnewclientSocket = new Socket("server", 4000)
जवाब
कंटेनर में होस्ट फाइल सिस्टम से अलग अपना फाइल सिस्टम होता है। आपका पथ C:\ServerMusicStorage
आपके कंटेनर में काम नहीं कर सकता क्योंकि यह फ़ाइल आपके कंटेनर में नहीं है।
आपको बाँधने या वॉल्यूम करने के लिए एक नज़र रखना चाहिए
या अपनी छवि बनाते समय फ़ाइल की प्रतिलिपि बनाना।
इसके अलावा आपका रास्ता एक विंडोज़ पथ है जिसे आपको एक यूनिक्स पथ (/ yourdirectory) के लिए बदलना चाहिए क्योंकि अधिकांश डॉकटर चित्र लिनक्स सिस्टम हैं
यदि आप अपने DockerFile में COPY का उपयोग करना चाहते हैं तो बस जोड़ें
COPY ServerMusicStorage/ /ServerMusicStorage
लेकिन अगर मैं गलत नहीं हूँ src फ़ाइल एक सापेक्ष पथ होना चाहिए ... तो संबंधित करने के लिए आप अपने निर्माण dir के पास / ServerMusicStorage डाल दिया है