डॉकर और जावा सॉकेट: कंटेनरों के बीच डेटा साझा करें

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

इसलिए जब मैं जावा नेटबीन्स आईडीई पर अपना कार्यक्रम चलाता हूं तो यह काम करता है जैसा मैं चाहता हूं। मुझे फाइलें मिलती हैं

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

जवाब

Ruokki Jan 11 2021 at 16:48

कंटेनर में होस्ट फाइल सिस्टम से अलग अपना फाइल सिस्टम होता है। आपका पथ C:\ServerMusicStorageआपके कंटेनर में काम नहीं कर सकता क्योंकि यह फ़ाइल आपके कंटेनर में नहीं है।

आपको बाँधने या वॉल्यूम करने के लिए एक नज़र रखना चाहिए

या अपनी छवि बनाते समय फ़ाइल की प्रतिलिपि बनाना।

इसके अलावा आपका रास्ता एक विंडोज़ पथ है जिसे आपको एक यूनिक्स पथ (/ yourdirectory) के लिए बदलना चाहिए क्योंकि अधिकांश डॉकटर चित्र लिनक्स सिस्टम हैं

यदि आप अपने DockerFile में COPY का उपयोग करना चाहते हैं तो बस जोड़ें

COPY ServerMusicStorage/ /ServerMusicStorage 

लेकिन अगर मैं गलत नहीं हूँ src फ़ाइल एक सापेक्ष पथ होना चाहिए ... तो संबंधित करने के लिए आप अपने निर्माण dir के पास / ServerMusicStorage डाल दिया है