Socket Connection Modes
Sockets दो Modes: Connection Oriented व Connectionless Mode में Connection स्थापित कर सकते हैं। Connection Oriented Sockets एक Telephone की तरह काम करते हैं, जिसमें एक बार Connection स्थापित होने के बाद केवल बात करने वाले दोनों लोगों के बीच ही Data का लेन-देन होता है और Data ठीक उसी क्रम में एक दूसरे के पास पहुंचते हैं, जिस क्रम में वे भेजे जाते हैं। जबकि Connectionless Sockets एक Mail की तरह काम करते हैं, जिसमें उनके ना तो उनके Deliver होने की Guarantee होती है ना ही उनके उसी क्रम में Destination पर पहुंचने की सम्भावना होती है, जिस क्रम में वे भेजे गए होते हैं।
ठीक उसी तरह से जिस तरह से अलग-अलग दिनों में यदि अलग-अलग Mails को भेजा गया हो, तो भी ये जरूरी नहीं होता है, कि वे उसी क्रम में अपने Destination पर पहुंचेंगे जिस क्रम में उन्हें भेजा गया था। हो सकता है कि जो Mail पहले भेजा गया हो वह बाद में अपने Destination पर पहुंचे और जो Mail बाद में भेजा गया हो वह पहले अपने Destination पर पहुंच जाए।
हम कौनसा Mode Use करते हैं ये बात हमारे Application की Requirement पर निर्भर होता है। यदि हमारे Application में Data की Reliability महत्वपूर्ण हो तो हमें Connection-Oriented Operation Mode को Use करना चाहिए। File Server Connection-Oriented Mode को Use करते हुए बनाए जाते हैं, क्योंकि उस तक पहुंचने वाले सभी Data ठीक तरीके से व समान क्रम में Deliver होने जरूरी होते हैं।
जब हमारे Application में Data की Reliability महत्वपूर्ण नहीं होती है, तब हम User Datagram Protocol (UDP) को Use कर सकते हैं। Datagram एक Self-Contained Unit होता है, जिसमें Data को Deliver करने से सम्बंधित सभी प्रकार की जानकारियां होती हैं।
इसे हम एक Envelop की तरह मान सकते हैं, जिसके बाहर की तरफ Delivery Address व Return Address होते हैं और Envelop के अन्दर वह Data होता है, जिसे Destination पर भेजना होता है। इस Mode में एक Datagram Socket किसी विशिष्ट Destination Socket से Connected नहीं होता है, बल्कि ये केवल Datagram को Send करने का काम करता है।
हालांकि ये Connection Fast व Efficient होता है, लेकिन ये Connection Data को Destination पर Deliver करने की Guarantee नहीं देता है।
Connection Oriented Protocol Transport Control Protocol (TCP) को Use करता है। इस Connection में Socket को Data Send करने से पहले उस Unique Destination से Connect होना जरूरी होता है, जिस पर वह Data को Send करना चाहता है।
एक बार Connect हो जाने के बाद Sockets को एक Streams Interface (Open, Read, Write, Close) का प्रयोग करके Access किया जाता है। एक Socket द्वारा जो भी कुछ भेजा जाता है, उसे Connection का दूसरा End उसी Sequence में प्राप्त करता है, जिस Sequence में उसे भेजा जाता है।
हालांकि Connection-Oriented Operation Connectionless Operation की तुलना में कम Efficient होता है, फिर भी इस बात की Guarantee होती है, कि Data उसके Destination तक जरूर पहुंचेगा।
किसी Client/Server Application में सामान्यतया एक Server (Program) किसी एक Computer पर Run होता है, जिसमें एक Socket होता है और ये किसी Specific Port से Bound होता है। किसी Client से Connection स्थापित करने के लिए ये Server अपने Socket के उस Specific Port पर किसी Client का Wait करता रहता है।
जबकि Client Side में Client (Program) उस Computer का Host Name जानता है, जिस पर Server (Program) Run हो रहा है और Server के Socket के उस Port Number को भी जानता है, जिससे Server Connected होता है।
Server से Connection स्थापित करने के लिए, Client का Computer, Server के Computer पर Server के Host Computer व Port से Connect होने की कोशिश करता है। यदि सबकुछ सामान्य हो तो Server, Client के Connection को Accept कर लेता है।
जब Server, Client की Request को Accept कर लेता है, तब Server एक नया Socket एक अलग Port से Bound हो जाता है। इसे एक नए Socket की जरूरत होती है, ताकि ये Original Socket के लिए नए Connections की Request को उस समय Listen कर सके, जब ये Connected Client की Request को पूरा कर रहा होता है।
यदि Client के Connection को Server Accept कर लेता है, तो Client Side में एक Socket Create हो जाता है और Client इस Socket का प्रयोग Server से Communication करने के लिए कर सकता है। ध्यान दें कि Client Side का Socket उस Port से Bound नहीं होता है, जिसका प्रयोग Server से Connect होने के लिए हो रहा है।
इसके बजाय Client जिस Computer पर Run हो रहा होता है, उस Computer का एक Local Port Number Client को Assign कर दिया जाता है। इतना करने के बाद Client व Server दोनों उनके Socket में Data को Write करके या उनके Socket से Data को Read करके Communication कर सकते हैं।
सारांश रूप में समझें तो Socket Network पर Run हो रहे दो Running Programs के 2-Way Communication का एक Endpoint होता है। Socket हमेंशा एक Port Number से Bound होता है, जिससे TCP Layer उस Application को Identify कर लेता है, जिसके लिए Data को भेजा गया होता है।
java.net Package हमें Socket नाम की एक Class Provide करता है, जिसका प्रयोग करके हम Client/Server Technology पर आधारित Application का Client Program Create कर सकते हैं, जो कि Network के Server End से Connect हो सकता है।
जावा हमें ServerSocket नाम की भी एक Class Provide करता है, जिसका प्रयोग करके हम Server Side का Application Create कर सकते हैं। इस Class का प्रयोग करके हम Server Side का जो Socket Create करते हैं, उसका प्रयोग करके Server Program Client Program की Request को Listen करके Client Program से Connect हो सकता है।
जब हम Web से Connect होना चाहते हैं, तब हमें URL Class से Related Classes (URLConnection, URLEncoder) का प्रयोग करना चाहिए, क्योंकि ये Sockets की तुलना में ज्यादा सुविधाजनक होती हैं। वास्तव में ULR Classes Socket Classes की तुलना में Web के लिए High Level Classes होती हैं, जो कि Socket Classes को Underlying Implementation या Low Level Classes के रूप में Use करती हैं।
Socket Programming in Java: Reading from and Writing to Socket
चलिए, हम एक उदाहरण द्वारा समझने की कोशिश करते हैं कि किस प्रकार से एक Client Program किसी Server Program से Socket Class का प्रयोग करके Connection स्थापित कर सकता है और Connection स्थापित करने के बाद Socket का प्रयोग करके कैसे Server को Data भेज सकता है और Server से Data को Receive कर सकता है।
इस उदाहरण में एक Client Program को Implement किया गया है, जिसका नाम EchoClient है और ये Program EchoServer नाम के Server Program से Connect होता है। Echo Server सामान्यतया अपने Client से Data को Receive करता है और फिर से उसी Data को Client को Return कर देता है। Client, Echo Server से Port Number 7 पर Contact कर सकता है।
EchoClient, EchoServer से Connect होने के लिए एक Socket Create करता है। ये User से Standard Input Stream से Input प्राप्त करता है और प्राप्त होने वाले Input Texts को Socket में Write करके Echo Server पर भेज देता है।
Server पर जो Text भेजा जाता है, Server उसी Texts को फिर से Socket के माध्यम से Client पर भेज देता है। जब Server से Data Client पर आ जाता है, तब Client उस Data को Socket से Read करके फिर से Display कर देता है।
import java.io.*; import java.net.*; public class EchoClient { public static void main(String[] args) throws IOException { Socket echoSocket = null; PrintWriter out = null; BufferedReader in = null; try{ echoSocket = new Socket("taranis", 7); out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); } catch (UnknownHostException e) { System.err.println("Don't know about host: taranis."); System.exit(1); } catch (IOException e) { System.err.println("Couldn't get I/O for the connection to: taranis."); System.exit(1); } BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in)); String userInput; while ((userInput = stdIn.readLine()) != null) { out.println(userInput); System.out.println("echo: " + in.readLine()); } out.close(); in.close(); stdIn.close(); echoSocket.close(); } }
इस Program में हम देख सकते हैं कि EchoClient Program, EchoServer Program से Data को Receive करने के लिए Data को Socket से ही Read करता है और EchoClient Program, EchoServer Program को Data Send करने के लिए भी Data को Socket में ही Write करता है।
इस Program के try Block में तीन ऐसे Statements लिखे गए हैं, जो Client Program व Server Program के बीच Socket Connection Establish करने का काम करते हैं और Socket के लिए एक PrintWriter व एक BufferedWriter Object Create करते हैं।
try { echoSocket = new Socket("taranis", 7); out = new PrintWriter(echoSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); }
इस Try Block का पहला Statement एक नया Socket Object Create करता है और उसका नाम echoSocket Assign करता है। इस Statement में Socket Constructor को Argument के रूप में उस Computer के नाम व Port Number की जरूरत होती है, जिससे हम EchoClient Program को Connect करना चाहते हैं।
इस उदाहरण में हमने Host Name के रूप में “Kuldeep” शब्द को Use किया है। ये नाम हमारे Local Network के केवल एक Imaginary Host Computer को Refer कर रहा है। जब हम इस Program को Network पर Run करते हैं, तब हमें इस नाम के स्थान पर Network के किसी Actual Host का नाम Specify करना होता है।
ध्यान रखें कि Host Name उस Host Computer का एक Fully Qualified IP Name होना जरूरी होता है, जिससे हम Connect होना चाहते हैं। दूसरे Argument के रूप में हमें Socket के उस Port का Number देना होता है, जिससे हमारा Program Connect होना है। Port Number 7 वह Port है, जिस पर Echo Server Listen करता है। इस उदाहरण में हमने Readers व Writers Classes का प्रयोग किया है, ताकि ये Socket पर Unicode Characters को Write कर सके।
Socket के Through Server पर Data को भेजने के लिए, EchoClient Program को केवल PrintWriter पर Data को Write करना होता है और Server Program का Response प्राप्त करने के लिए, EchoClient Program BufferedReader को Read करता है।
Try … Catch Block के बाद एक और BufferedReader प्रकार का एक Object stdIn है, जो कि Keyboard से प्राप्त Data को Store करता है। इससे आगे एक while Loop का प्रयोग किया गया है। ये Loop Keyboard से एक बार में एक Line Read करता है और उसे String प्रकार के एक Object userInput में Store कर देता है। फिर इस String प्रकार के Object में Stored String को सीधे ही PrintWriter Type के एक Object out में Write कर देता है। ऐसा करने पर out Object में भेजा गया Data Server पर पहुंच जाता है, क्योंकि PrintWriter Type के Object को Try Block के दूसरे Statement द्वारा Server के Socket से Connect किया गया है।
while Loop का अन्तिम Statement BufferedReader Object in से एक Line को Read करता है, जो कि Try Block के तीसरे Statement द्वारा Socket से Connected है। इस Statement में प्रयोग किया गया readLine() Method तब तक Wait करता रहता है, जब तक कि Server Program Information को फिर से Client Program में नहीं भेज देता है। जब readLine() Method Return होता है, तब EchoClient Program के While Loop का अन्तिम Statement Server से Return होने वाले Text को फिर से Monitor पर Display कर देता है। Program के अन्त में सभी Streams को Close किया गया है।
इनके Close करने का क्रम काफी महत्वपूर्ण होता है। Socket को Close करने से पहले हमें Socket से Connected सभी Streams को Close करना जरूरी होता है। यानी Socket को हमेंशा Program के अन्तिम Statement में Close करना चाहिए। इस तरह से एक Client Program को निम्नानुसार पांच Steps में Develop किया जाता है:
- सबसे पहले एक Socket Open किया जाता है।
- Socket पर एक Input Stream व एक Output Stream को Open किया जाता है।
- Server से Data को Read करने व Server पर Data को Write करने के लिए इन्हीं Streams का प्रयोग किया जाता है।
- Streams को Close किया जाता है।
- Socket को Close किया जाता है।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook Java in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
Java Programming Language in Hindi | Page: 682 | Format: PDF