यदि Socket
क्लाइंट पक्ष का प्रतिनिधित्व करता है और ServerSocket
सर्वर पक्ष का प्रतिनिधित्व करता है, तो क्यों Socket.read
सर्वर पक्ष से डेटा पढ़ता है? मैं वास्तव में उलझन में हूं, क्या आप इसे मुझे स्पष्ट कर सकते हैं?सॉकेट और सर्वर सॉकेट के बीच क्या अंतर है?
उत्तर
क्योंकि यह पढ़ रहा है कि आपको सर्वर द्वारा भेजा गया है।
सर्वर सॉकेट सर्वर सॉर्टपॉइंट की अतिरिक्त सुविधाओं के साथ फिर से सॉकेट है। सर्वर सुविधाओं बंदरगाह सुनने और एक इनकमिंग कनेक्शन आदि को स्वीकार भी शामिल है ...
क्योंकि यह डेटा द्वारा भेजा पढ़ रही है क्यों socket.read serverside
से डेटा पढ़ता है नेटवर्क के माध्यम से सर्वर, यह सीधे सर्वर फाइल सिस्टम या resouces (डीबी, राम या उस तरह कुछ भी नहीं पढ़ रहा है) यह डेटा को पढ़ रहा है जो पहले से ही सर्वर सॉकेट द्वारा संसाधित किया गया था।
सॉकेट के बारे में सोचें अपने वेब ब्राउज़र और सर्वरस्केट को दूरस्थ वेबसर्वर के रूप में।
जब आप किसी छवि, पृष्ठ, आदि का अनुरोध करते हैं, तो वेबसर्वर (सर्वर सॉकेट) क्लाइंट को बाइट लिखता है, बदले में क्लाइंट को उन्हें पढ़ना पड़ता है (यह जानने के लिए कि वेबसर्वर सही क्या भेजा गया है?) और उन्हें प्रदर्शित करके संसाधित करें उन्हें अंतिम उपयोगकर्ता को।
सर्वर सॉकेट/सॉकेट के साथ ही कम स्तर पर समान खुशी। सॉकेट सर्वर सॉकेट से जानकारी पढ़ता है।
क्या यह समझ में आता है?
Socket
क्लाइंट साइड के लिए है और ServerSocket
सर्वर साइड के लिए है पर एक नजर डालें।
java.net.ServerSocket
इस वर्ग सर्वर सॉकेट लागू करता है। एक सर्वर सॉकेट नेटवर्क पर आने के लिए अनुरोधों के लिए प्रतीक्षा करता है। यह उस अनुरोध पर पर आधारित कुछ ऑपरेशन करता है, और फिर संभवतः अनुरोधकर्ता को परिणाम देता है।
java.net.Socket
इस वर्ग के ग्राहक सॉकेट (भी सिर्फ "सॉकेट" कहा जाता है) लागू करता है। एक सॉकेट दो मशीनों के बीच संचार के लिए एक अंतराल है।
(मैं इस उत्तर पोस्ट क्योंकि मैं हमेशा लगता है कि यह तर्क सही बनाने के लिए महत्वपूर्ण है।)
मैं तुम्हें निम्न नमूना पर एक नज़र डालें सुझाव देते हैं।
http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html
वैसे, जब टीसीपी/आईपी संचार से बाहर ले जाने, सभी आवश्यक जानकारी अकेले Socket
वर्ग द्वारा संचार के एकमात्र उद्देश्य के लिए प्रदान किया जा सकता। कोई फर्क नहीं पड़ता कि यह सर्वर पक्ष या ग्राहक पक्ष पर है।
जैसा कि आप उपरोक्त लिंक से देख सकते हैं, सर्वर पक्ष अपने Socket
उदाहरण प्राप्त करने के लिए निम्न कोड का उपयोग करें। यही है, अन्य सॉकेट पर पोर्ट पर बनाया गया है।
फिर, सर्वर का उपयोग इस Socket
उदाहरण ग्राहक के लिए बात करने के लिए।
और चित्र को पूरा करने के लिए, कोड स्निपेट के नीचे क्लाइंट टी Socket
उदाहरण दिखाता है।
तो अगर Socket
पहले से ही यह सब कर सकते हैं, यही कारण है कि हम अभी भी ServerSocket
की ज़रूरत है?
यह टीसीपी/आईपी प्रोटोकॉल पर संचार के कामकाजी प्रतिमान की वजह से है।
2 कार्यक्रमों टीसीपी/आईपी पर बात करते हैं, आम तौर पर एक निष्क्रिय सुनने/एक <IP:port>
पर प्रतीक्षा करें और एक दूसरे सक्रिय रूप से उससे कनेक्ट होगा।
तो आप संचार के इस starting phase
पर देख सकते हैं, दोनों पक्षों के बहुत अलग व्यवहार हैं। तो इस अंतर को दर्शाने के लिए 2 अलग-अलग वर्गों का उपयोग किया जाता है।
Socket
कक्षा सक्रिय पक्ष के व्यवहार को समाहित करती है। (ग्राहक उर्फ)ServerSocket
वर्ग निष्क्रिय पक्ष के व्यवहार समाहित (सर्वर उर्फ)
एक बार ServerSocket
अपने सुनने के कार्य और detected
एक इनकमिंग कनेक्शन पूरा किया है, यह इसके accept()
और एक नया Socket
पैदा करेगा संचार की सुविधा के लिए उदाहरण।
इसी तरह, java.nio
पैकेज में, आपको ServerSocketChannel
और SocketChannel
कक्षाएं मिलेंगी। और फिर भी, वे इस तरह व्यवहार करते हैं:
ServerSocketChannel -------------> SocketChannel
accept()
तो, कुछ हद तक, मैं @JohnK से सहमत के रूप में वह टिप्पणी, it's more or less just a 6-letter difference
में बताया।
जानकारी के रूप में जानकारी प्रदान न करें जो पाठ हो सकता है। –
@KarlRichter यह बेहतर उच्च प्रकाश व्यवस्था के लिए है। – smwikipedia
सबसे पहले, के क्या है Socket
की तरह लग स्पष्ट करते हैं: 127.0.0.1:8080
: एक आम मामले में, Socket
आईपी का एक संयोजन और :
के माध्यम से बंदरगाह, उदाहरण के लिए है।
तो, आपने Socket
का उपयोग कर क्लाइंट-सर्वर एप्लिकेशन बनाने का निर्णय लिया है। बहुत जटिल नहीं है। यहाँ client
और server
के बीच संबंध बनाने के बारे में संक्षिप्त विवरण है:
- पहले, आइए उस तथ्य को स्पष्ट, हमारे
client
अपने हीSocket
है औरserver
आईपी पते और पोर्ट जानता है कि करते हैं।server
के लिए केवलServerSocket
और पोर्ट प्रदान किया गया है। दोनों ही मामलों बंदरगाह में एक ही नंबर 0 और 65535 - तो, हम कनेक्ट करने का फैसला किया हैं हमारे
client
के लिए हमारीserver
:client
ज्ञात आईपी और हमारेserver
के बंदरगाह के साथ अपनेSocket clientSocket
वस्तु बनाता है।server
अपनेServerSocket.accept()
विधि है, जो नएSocket newClientSocket
वस्तु (अभी भी एकserver
पक्ष (!) पर) उत्पन्न करता है के साथ आने वाली कनेक्शन अनुरोध मिला है।आगे का आदान प्रदान डेटा
clientSocket
औरnewClientSocket
वस्तुओं (clientSocket
औरServerSocket
के बीच नहीं) के माध्यम से चला जाता है।
के बीच
Here लगभग पूर्ण बुनियादी कनेक्शन प्रक्रिया को समझने के लिए तस्वीर है (ध्यान रखें कि इस चित्र को Client
पर Socket
वस्तु - एक ही वस्तुओं)।
इस सरल संरचना को बनाने के बाद, आपको जानकारी पढ़ने और लिखने के लिए Client.clientSocket
और Server.newClientSocket
दोनों पक्षों पर दो स्ट्रीम खोलने की आवश्यकता है।
ServerSocket
क्लाइंट से connect
के लिए bind
पर पोर्ट और listen
पर बनाया गया है। तो, एक सर्वर बस एक वार्तालाप की प्रतीक्षा करता है और एक शुरू नहीं करता है।
ClientSocket
connect
पर listen
आईएनजी सर्वर पर बनाया गया है। ग्राहक कनेक्शन शुरू करता है।
उदाहरण: उदाहरण के रूप में एक इनबाउंड कॉल सेंटर के बारे में सोचें। ये सेवाएं सर्वर हैं। वे कॉल शुरू नहीं करते हैं लेकिन ग्राहकों से आने वाले कॉल की प्रतीक्षा करते हैं। कॉल करने के बाद, वे दो तरह की वार्तालाप में शामिल हो सकते हैं।
जबकि यह सैद्धांतिक रूप से प्रश्न का उत्तर दे सकता है, [यह बेहतर होगा] (// meta.stackoverflow.com/q/8259) यहां उत्तर के आवश्यक हिस्सों को शामिल करने के लिए, और संदर्भ के लिए लिंक प्रदान करें। –