Client Server Program in Java

Client Server Program in Java: इस उदाहरण में एक Client व Server को Socket का प्रयोग करके समझाया गया है। जितने भी Servers होते हैं, वे सभी किसी Client के Connect होने का Wait करते रहते हैं। जब Connection स्थापित हो जाता है, तब Connection द्वारा Produce होने वाले Socket के लिए एक InputStream व एक OutputStream Object को Create किया जाता है। फिर इन दोनों प्रकार के Objects को ReaderWriter प्रकार के Objects में Convert करके BufferedReaderPrintWriter Class के Object में Store किया जाता है। इसके बाद BufferedReader Object से जो कुछ भी Read किया जाता है, वह सबकुछ PrintWriter Object में तब तक Echo किया जाता है, जब तक कि Line का “END” नहीं मिलता है। जब Line का End मिल जाता है, तब Connection Close हो जाता है।

इसी तरह से एक Client जब एक Server से Connection बनाता है, तब वह भी एक InputStream Object व एक OutputStream Object Create करता है और Server से Return होने वाले Data को Server की तरह ही इन दोनों प्रकार के Objects को ReaderWriter प्रकार के Objects में Convert करके BufferedReaderPrintWriter Class के Objects में Store करता है।

Client व Server दोनों ही समान Port Number को Use करते हैं और Client Local Computer के IP Address को Use करता है, इसलिए इस Program को Test करने के लिए इसे Network पर Store करने की जरूरत नहीं होती है, हम एक ही Computer पर Client व Server दोनों को Test कर सकते हैं। हमारे Program का Server निम्नानुसार है:

	// Very simple server that just
	// echoes whatever the client sends.
	import java.io.*;
	import java.net.*;
	
	public class Server 
	{  
	  // Choose a port outside of the range 1-1024:
	  public static final int PORT = 8080;
	  public static void main(String[] args) throws IOException 
	  {
	    ServerSocket s = new ServerSocket(PORT);
	    System.out.println("Started: " + s);
	
	    try {
	      // Blocks until a connection occurs:
	      Socket socket = s.accept();
	
	      try {
	        System.out.println("Connection accepted: "+ socket);
	        BufferedReader in = 
	          new BufferedReader(
	            new InputStreamReader(
	              socket.getInputStream()));
	
	        // Output is automatically flushed by PrintWriter:
	        PrintWriter out = 
	          new PrintWriter(
	            new BufferedWriter(
	              new OutputStreamWriter(
	                socket.getOutputStream())),true);
	
	        while (true) {  
	          String str = in.readLine();
	          if (str.equals("END")) break;
	          System.out.println("Echoing: " + str);
	          out.println(str);
	        }
	
	      // Always close the two sockets...
	      } 
			finally {
	        System.out.println("closing...");
	        socket.close();
	      }
	    } 

	    finally {
	      s.close();
	    }
	  } 
	}

इस Program में हम देख सकते हैं कि ServerSocket को केवल एक Port Number की ही जरूरत होती है। जब हम इस Server में accept() Method को Call करते हैं, तब ये Method तब तक के लिए Block हो जाता है, जब तक कि कोई Client इस Server से Connect होने की कोशिश नहीं करता है।

यानी ये Method किसी Client Program के Connect होने का Wait करता रहता है। जब कोई Client इससे Connect होता है, यानी जब Connection Accept हो जाता है, तब accept() Method एक Socket Object Return करता है, जो कि Server/Client के बीच के इस Connection को Represent करता है।

इस Program में Sockets को Clean up करने का काम काफी सावधानीपूर्वक किया गया है। यदि ServerSocket Constructor Fail हो जाता है, यानी यदि ServerSocket Port Number से Connect नहीं हो पाता है, तो  Program Terminate हो जाता है।

हम यहां पर ये मान कर चल रहे हैं कि यदि ServerSocket Constructor Fail हो जाता है, तो इस Socket से Connected कोई भी Network Socket Open नहीं रहना चाहिए। इसलिए main() Method द्वारा एक IOException Throw करवाया गया है, ताकि Try Block की जरूरत ना रहे।

यदि ServerSocket का Constructor Successful होता है, तो जितने भी अन्‍य Methods Call होते हैं, उन्हें एक Try…Finally Block में ये निश्चित करने के लिए Monitor किया जाता है, कि Control द्वारा Blocks को चाहे किसी भी तरह से छोडा जाए, ServerSocket उचित तरीके से Close होना ही चाहिए।

इसी Logic को accept() Method द्वारा Return होने वाले Socket पर भी Apply किया जाता है। यदि accept() Method Fail हो जाता है, तो हमें ये मानना होता है कि या तो Socket Exist नहीं है या फिर किसी अन्‍य Resource को Hold कर रहा है, इसलिए इसे Clean करने की जरूरत नहीं है।

यदि ये Method Successful होता है, तो भी इससे आगे के Statements एक Try…Finally Block में होने चाहिए, ताकि यदि ये Fail भी हो जाए, तो भी Socket Clean हो जाए। ये सावधानी रखना इसलिए जरूरी है क्योंकि Sockets कई महत्वपूर्ण लेकिन Non-Memory Resources को Use करते हैं। जावा में इस काम को करने के लिए कोई Destructor नहीं होता है।

accept() Method द्वारा Produce होने वाले ServerSocket व Socket दोनों को System.out Statement द्वारा Print किया गया है। यानी इनके toString() Methods Automatically Call हो जाते हैं।

Program का अगला हिस्सा ठीक उसी तरह दिखाई देता है, जैसे हम Reading व Writing के लिए कोई File Open कर रहे हों, बजाय इसके कि हम Socket Object के आधार पर InputStreamOutputStream Objects को Create कर रहे हैं। InputStream व OutputStream दोनों Objects को क्रमश: InputStreamReaderOutputStreamWriter Converter Classes का प्रयोग करके ReaderWriter Class में Convert किया गया है।

इस Program में हमने PrintWriter Class के Constructor में दूसरे Argument के रूप में “truePass किया है, जो कि एक boolean Flag है और ये इस बात को Signify करता है कि हर println() Method के बाद Output को Flush कर दिया जाना चाहिए। ऐसा केवल println() Method के साथ ही होता है, print() Method के साथ ये प्रक्रिया Apply नहीं होती है।

हम जितनी बार भी “out” Object में Data Write करते हैं, हमें इसके Buffer को Flush करना जरूरी होता है। इस Example में Flush करना इसलिए जरूरी होता है, क्योंकि Client व Server दोनों ही Proceed करने या आगे बढने से पहले एक दूसरे से एक Text Line का Wait करते हैं। यदि Flushing नहीं किया जाएगा, तो Data तब तक Network पर नहीं भेजा जाएगा, जब तक कि Buffer Full नहीं हो जाता है।

जब हम Network से सम्बंधित Programs लिख रहे होते हैं, तब हमें Automatic Flushing के सम्बंधत में काफी सावधान रहना होता है। हम जितनी बार भी Buffer को Flush करते हैं, एक Packet Create करके Send किया जाना चाहिए। इस स्थिति में वही हो रहा है जो हम चाहते हैं, क्योंकि यदि जिस Packet में “Text Line” Stored है, उसे Send नहीं किया जाएगा, तो Server व Client के बीच Data का लेन&देन नहीं हो सकता है।

दूसरे तरीके से देखें तो इस Program में Line का End Message का End होता है। लेकिन बहुत सी अन्‍य परिस्थितियों में Messages Line By Line नहीं भेजे जाते हैं। इसलिए इस प्रकार की परिस्थितियों में Auto Flushing को Use करने के बजाय यदि Built-In Buffering System को ही ये तय करने दिया जाए, कि Packet को कब Build करके Send करना है, तो ये तरीका ज्यादा Efficient तरीका होता है।

इस Program का Infinite While Loop BufferedReader in से Lines को Read करता है और इस Information को System.out व PrintWriter out पर Write करता है। ध्‍यान दें कि inout कोई भी Stream हो सकती हैं, बस जरूरी बात ये है कि ये Network से Connected हों।

Server Create करने के बाद Server को Test करने के लिए हम Telnet नाम के Client Software का प्रयोग कर सकते हैं। Server को Run करने पर हमें Screen पर निम्नानुसार Statement दिखाई देता है और Cursor Blink करता है, जो इस बात का Signal होता है, कि Server किसी Client के Connect होने का Wait कर रहा है:

        Started: ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=8080]

अब Start Button पर Click करके Run Option को Select करने पर एक Dialog Box दिखाई देता है, जिसमें “Telnet” Type करके Enter करने पर हमारे सामने निम्नानुसार एक Client Window Display होता है:

Client Server Program in Java in Hindi

Server से Connect होने के लिए हमें Telnet Prompt पर चित्र में दिखाई दे रहे Command को Type करके Enter करना होता है। इस Statement में Character “o” किसी Server से Connection को Open करने का Command होता है। शब्द “localhost” उस Computer को Specify करता है, जिस पर Server Program Run हो रहा है।

तीसरा Parameter उस Port Number को Specify करता है, जिस पर Server Program Client से Connect होने का Wait कर रहा होता है। चूंकि हम हमारे Local Computer पर ही Server Program को Run कर रहे हैं, इसलिए दूसरे Argument के रूप में हमने “localhost” शब्द Specify किया है, जबकि हमारा Server, Client को Port Number 8080 पर Listen करता है, इसलिए तीसरे Argument के रूप में हमने 8080 Use किया है।

जब हम ये Command Type करके Enter Key Press करते हैं, तब Telnet Client Window पर “Connecting To localhost…” लिखा हुआ आता है, जबकि Server Window में हमें “Connection accepted: Socket[addr=/127.0.0.1,port=1035,localport=8080]” Statement दिखाई देता है, जो बताता है कि Telnet Client, localhost Server से Connect हो गया है।

अब हम Telnet Client Window में जो कुछ भी Type करते हैं, वही String Server द्वारा फिर से हमारे Client Window में Echo कर दिया जाता है। यदि हम Telnet Client का Connection Server से Break करना चाहें, तो हमें “END” Type करना होता है। जैसे ही हम “END” Type करते हैं, Client Window पर “Connection to host lost.” Message लिखा हुआ दिखाई देता है और Server Program पर “closing…” Message लिखा हुआ दिखाई देने लगता है।

Java Programming Language in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook Java in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

Java Programming Language in Hindi | Page: 682 | Format: PDF

BUY NOW GET DEMO REVIEWS