जावा - नेटवर्किंग

अवधि नेटवर्क प्रोग्रामिंग प्रोग्राम हैं जो कई उपकरणों (कंप्यूटर), जिसमें उपकरणों सब एक नेटवर्क का उपयोग कर एक दूसरे से जुड़े हुए हैं भर में अमल लेखन को दर्शाता है।

J2SE API के java.net पैकेज में उन कक्षाओं और इंटरफेस का संग्रह है जो निम्न-स्तरीय संचार विवरण प्रदान करते हैं, जिससे आप ऐसे प्रोग्राम लिख सकते हैं जो समस्या को हल करने पर ध्यान केंद्रित करते हैं।

Java.net पैकेज दो सामान्य नेटवर्क प्रोटोकॉल के लिए समर्थन प्रदान करता है -

  • TCP- टीसीपी ट्रांसमिशन ट्रांसमिशन प्रोटोकॉल के लिए है, जो दो अनुप्रयोगों के बीच विश्वसनीय संचार की अनुमति देता है। टीसीपी का उपयोग आमतौर पर इंटरनेट प्रोटोकॉल पर किया जाता है, जिसे टीसीपी / आईपी कहा जाता है।

  • UDP - यूडीपी उपयोगकर्ता डेटाग्राम प्रोटोकॉल के लिए खड़ा है, एक कनेक्शन-कम प्रोटोकॉल जो अनुप्रयोगों के बीच डेटा के पैकेट को प्रसारित करने की अनुमति देता है।

यह अध्याय निम्नलिखित दो विषयों पर एक अच्छी समझ देता है -

  • Socket Programming - यह नेटवर्किंग में सबसे व्यापक रूप से उपयोग की जाने वाली अवधारणा है और इसे बहुत विस्तार से समझाया गया है।

  • URL Processing- यह अलग से कवर किया जाएगा। जावा भाषा में URL प्रोसेसिंग के बारे में जानने के लिए यहाँ क्लिक करें ।

सॉकेट प्रोग्रामिंग

सॉकेट टीसीपी का उपयोग करके दो कंप्यूटरों के बीच संचार तंत्र प्रदान करता है। एक क्लाइंट प्रोग्राम संचार के अंत में एक सॉकेट बनाता है और उस सॉकेट को सर्वर से जोड़ने का प्रयास करता है।

जब कनेक्शन किया जाता है, तो सर्वर संचार के अंत में एक सॉकेट ऑब्जेक्ट बनाता है। क्लाइंट और सर्वर अब सॉकेट से लिखने और पढ़ने के लिए संवाद कर सकते हैं।

Java.net.Socket वर्ग एक सॉकेट का प्रतिनिधित्व करता है, और java.net.ServerSocket क्लास क्लाइंट प्रोग्राम को क्लाइंट्स को सुनने और उनके साथ कनेक्शन स्थापित करने के लिए एक तंत्र प्रदान करता है।

सॉकेट्स का उपयोग करते हुए दो कंप्यूटरों के बीच एक टीसीपी कनेक्शन स्थापित करते समय निम्न चरण होते हैं -

  • सर्वर एक ServerSocket ऑब्जेक्ट को दर्शाता है, यह दर्शाते हुए कि पोर्ट नंबर संचार किस पर होना है।

  • सर्वर सर्वर सॉकेट श्रेणी के स्वीकार () विधि को आमंत्रित करता है। यह विधि तब तक प्रतीक्षा करती है जब तक कि कोई क्लाइंट दिए गए पोर्ट पर सर्वर से कनेक्ट नहीं होता है।

  • सर्वर प्रतीक्षा करने के बाद, एक क्लाइंट सॉकेट ऑब्जेक्ट को इंस्टेंट करता है, जिससे सर्वर का नाम और पोर्ट नंबर को कनेक्ट करने के लिए निर्दिष्ट किया जाता है।

  • सॉकेट क्लास का निर्माण क्लाइंट को निर्दिष्ट सर्वर और पोर्ट नंबर से जोड़ने का प्रयास करता है। यदि संचार स्थापित किया गया है, तो क्लाइंट के पास अब सॉकेट ऑब्जेक्ट है जो सर्वर के साथ संचार करने में सक्षम है।

  • सर्वर की ओर, स्वीकार () विधि क्लाइंट के सॉकेट से जुड़े सर्वर पर एक नए सॉकेट का संदर्भ देती है।

कनेक्शन स्थापित होने के बाद, I / O स्ट्रीम का उपयोग करके संचार हो सकता है। प्रत्येक सॉकेट में एक आउटपुटस्ट्रीम और एक इनपुटस्ट्रीम दोनों होते हैं। क्लाइंट का आउटपुटस्ट्रीम सर्वर के इनपुटस्ट्रीम से जुड़ा होता है, और क्लाइंट का इनपुटस्ट्रीम सर्वर के आउटपुटस्ट्रीम से जुड़ा होता है।

टीसीपी एक दो-तरफ़ा संचार प्रोटोकॉल है, इसलिए एक ही समय में दोनों धाराओं में डेटा भेजा जा सकता है। सॉकेट्स को लागू करने के तरीकों का पूरा सेट प्रदान करने वाली उपयोगी कक्षाएं निम्नलिखित हैं।

ServerSocket क्लास मेथड्स

java.net.ServerSocket पोर्ट प्राप्त करने और क्लाइंट अनुरोधों को सुनने के लिए सर्वर एप्लिकेशन द्वारा क्लास का उपयोग किया जाता है।

ServerSocket क्लास में चार कंस्ट्रक्टर हैं -

अनु क्रमांक। विधि और विवरण
1

public ServerSocket(int port) throws IOException

निर्दिष्ट पोर्ट से बंधे सर्वर सॉकेट बनाने का प्रयास। अपवाद तब होता है जब पोर्ट पहले से ही किसी अन्य अनुप्रयोग द्वारा बाध्य है।

2

public ServerSocket(int port, int backlog) throws IOException

पिछले कंस्ट्रक्टर के समान, बैकलॉग पैरामीटर निर्दिष्ट करता है कि कितने आवक ग्राहकों को एक प्रतीक्षा कतार में स्टोर करना है।

3

public ServerSocket(int port, int backlog, InetAddress address) throws IOException

पिछले निर्माता के समान, InetAddress पैरामीटर स्थानीय IP पते को बाइंड करने के लिए निर्दिष्ट करता है। InetAddress का उपयोग उन सर्वरों के लिए किया जाता है, जिनके पास कई IP पते हो सकते हैं, जिससे सर्वर को यह निर्दिष्ट करने की अनुमति मिलती है कि ग्राहक अनुरोधों को स्वीकार करने के लिए अपने IP पते में से कौन-सा IP पता है।

4

public ServerSocket() throws IOException

एक अनबाउंड सर्वर सॉकेट बनाता है। इस कंस्ट्रक्टर का उपयोग करते समय, आप सर्वर सॉकेट को बांधने के लिए तैयार होने पर बाइंड () विधि का उपयोग करें।

यदि ServerSocket कंस्ट्रक्टर अपवाद को नहीं फेंकता है, तो इसका मतलब है कि आपका एप्लिकेशन सफलतापूर्वक निर्दिष्ट पोर्ट से बंध गया है और क्लाइंट अनुरोधों के लिए तैयार है।

ServerSocket क्लास के कुछ सामान्य तरीके निम्नलिखित हैं -

अनु क्रमांक। विधि और विवरण
1

public int getLocalPort()

उस पोर्ट को लौटाता है जो सर्वर सॉकेट पर सुन रहा है। यह विधि उपयोगी है यदि आप एक निर्माणकर्ता में पोर्ट संख्या के रूप में 0 में पारित हुए हैं और सर्वर को आपके लिए एक पोर्ट ढूंढने दें।

2

public Socket accept() throws IOException

आने वाले ग्राहक की प्रतीक्षा करता है। यह विधि तब तक अवरुद्ध होती है जब तक कि कोई क्लाइंट निर्दिष्ट पोर्ट या सॉकेट समय पर सर्वर से कनेक्ट नहीं होता है, यह मानते हुए कि सेट-टाइमटाइम () विधि का उपयोग करके टाइम-आउट मान सेट किया गया है। अन्यथा, यह विधि अनिश्चित काल के लिए ब्लॉक हो जाती है।

3

public void setSoTimeout(int timeout)

स्वीकार के दौरान क्लाइंट के लिए सर्वर सॉकेट का इंतजार करने के लिए टाइम-आउट मान सेट करता है।

4

public void bind(SocketAddress host, int backlog)

सॉकेट को निर्दिष्ट सर्वर पर सेट करता है और सॉकेटअंड्रेस ऑब्जेक्ट में पोर्ट। इस विधि का उपयोग करें यदि आपने सर्वर-सॉकेट को नो-तर्क कंस्ट्रक्टर का उपयोग करके त्वरित किया है।

जब ServerSocket आमंत्रण स्वीकार करता है (), क्लाइंट के कनेक्ट होने तक यह विधि वापस नहीं आती है। क्लाइंट के कनेक्ट होने के बाद, सर्वर सॉकेट एक अनिर्दिष्ट पोर्ट पर एक नया सॉकेट बनाता है और इस नए सॉकेट का संदर्भ देता है। एक टीसीपी कनेक्शन अब क्लाइंट और सर्वर के बीच मौजूद है, और संचार शुरू हो सकता है।

सॉकेट क्लास के तरीके

java.net.Socketवर्ग सॉकेट का प्रतिनिधित्व करता है जो क्लाइंट और सर्वर दोनों एक दूसरे के साथ संवाद करने के लिए उपयोग करते हैं। क्लाइंट एक इंस्टेंटिंग द्वारा सॉकेट ऑब्जेक्ट प्राप्त करता है, जबकि सर्वर स्वीकार () विधि के रिटर्न वैल्यू से सॉकेट ऑब्जेक्ट प्राप्त करता है।

सॉकेट क्लास में पांच कंस्ट्रक्टर होते हैं जो क्लाइंट सर्वर से कनेक्ट करने के लिए उपयोग करता है -

अनु क्रमांक। विधि और विवरण
1

public Socket(String host, int port) throws UnknownHostException, IOException.

यह विधि निर्दिष्ट पोर्ट पर निर्दिष्ट सर्वर से कनेक्ट करने का प्रयास करती है। यदि यह निर्माता अपवाद को नहीं फेंकता है, तो कनेक्शन सफल होता है और क्लाइंट सर्वर से जुड़ा होता है।

2

public Socket(InetAddress host, int port) throws IOException

यह विधि पिछले निर्माता के समान है, सिवाय इसके कि मेजबान को एक InetAddress ऑब्जेक्ट द्वारा दर्शाया गया है।

3

public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.

निर्दिष्ट होस्ट और पोर्ट से जुड़ता है, निर्दिष्ट पते और पोर्ट पर स्थानीय होस्ट पर एक सॉकेट बनाता है।

4

public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.

यह विधि पिछले कंस्ट्रक्टर के समान है, सिवाय इसके कि होस्ट को स्ट्रिंग के बजाय एक InetAddress ऑब्जेक्ट द्वारा दर्शाया गया है।

5

public Socket()

एक असंबद्ध सॉकेट बनाता है। इस सॉकेट को सर्वर से जोड़ने के लिए कनेक्ट () विधि का उपयोग करें।

सॉकेट कंस्ट्रक्टर जब वापस आता है, तो यह केवल सॉकेट ऑब्जेक्ट को इंस्टेंट नहीं करता है, लेकिन यह वास्तव में निर्दिष्ट सर्वर और पोर्ट से कनेक्ट करने का प्रयास करता है।

सॉकेट क्लास में रुचि के कुछ तरीके यहां सूचीबद्ध हैं। ध्यान दें कि क्लाइंट और सर्वर दोनों में सॉकेट ऑब्जेक्ट है, इसलिए इन तरीकों को क्लाइंट और सर्वर दोनों द्वारा लागू किया जा सकता है।

अनु क्रमांक। विधि और विवरण
1

public void connect(SocketAddress host, int timeout) throws IOException

यह विधि सॉकेट को निर्दिष्ट होस्ट से जोड़ती है। इस विधि की आवश्यकता तभी होती है जब आप सॉकेट को नो-लॉजिक कंस्ट्रक्टर का उपयोग करके इंस्टेंट करते हैं।

2

public InetAddress getInetAddress()

यह विधि दूसरे कंप्यूटर के पते को लौटाती है जिससे यह सॉकेट जुड़ा होता है।

3

public int getPort()

पोर्ट को लौटाता है सॉकेट रिमोट मशीन पर बाध्य होता है।

4

public int getLocalPort()

उस पोर्ट को लौटाता है जो सॉकेट लोकल मशीन पर बंधा होता है।

5

public SocketAddress getRemoteSocketAddress()

रिमोट सॉकेट का पता देता है।

6

public InputStream getInputStream() throws IOException

सॉकेट की इनपुट स्ट्रीम लौटाता है। इनपुट स्ट्रीम रिमोट सॉकेट के आउटपुट स्ट्रीम से जुड़ा है।

7

public OutputStream getOutputStream() throws IOException

सॉकेट के आउटपुट स्ट्रीम को लौटाता है। आउटपुट स्ट्रीम रिमोट सॉकेट के इनपुट स्ट्रीम से जुड़ा होता है।

8

public void close() throws IOException

सॉकेट को बंद कर देता है, जो इस सॉकेट ऑब्जेक्ट को अब किसी भी सर्वर से दोबारा कनेक्ट करने में सक्षम नहीं बनाता है।

InetAddress कक्षा के तरीके

यह वर्ग एक इंटरनेट प्रोटोकॉल (IP) पते का प्रतिनिधित्व करता है। यहां उन उपयोगी विधियों का पालन किया जा रहा है, जिनकी आपको सॉकेट प्रोग्रामिंग करते समय आवश्यकता होगी -

अनु क्रमांक। विधि और विवरण
1

static InetAddress getByAddress(byte[] addr)

रिटर्न एक InetAddress कच्चे IP पता दिया वस्तु।

2

static InetAddress getByAddress(String host, byte[] addr)

प्रदान किए गए होस्ट नाम और आईपी पते के आधार पर एक InetAddress बनाता है।

3

static InetAddress getByName(String host)

होस्ट के नाम को देखते हुए, होस्ट का IP पता निर्धारित करता है।

4

String getHostAddress()

पाठ प्रस्तुति में IP पता स्ट्रिंग लौटाता है।

5

String getHostName()

इस IP पते के लिए होस्ट नाम मिलता है।

6

static InetAddress InetAddress getLocalHost()

स्थानीय होस्ट लौटाता है।

7

String toString()

इस IP पते को एक स्ट्रिंग में परिवर्तित करता है।

सॉकेट क्लाइंट उदाहरण

निम्नलिखित ग्रीटिंगक्लाइंट एक क्लाइंट प्रोग्राम है जो एक सॉकेट का उपयोग करके सर्वर से जुड़ता है और ग्रीटिंग भेजता है, और फिर प्रतिक्रिया की प्रतीक्षा करता है।

उदाहरण

// File Name GreetingClient.java
import java.net.*;
import java.io.*;

public class GreetingClient {

   public static void main(String [] args) {
      String serverName = args[0];
      int port = Integer.parseInt(args[1]);
      try {
         System.out.println("Connecting to " + serverName + " on port " + port);
         Socket client = new Socket(serverName, port);
         
         System.out.println("Just connected to " + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
         
         out.writeUTF("Hello from " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         
         System.out.println("Server says " + in.readUTF());
         client.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

सॉकेट सर्वर उदाहरण

निम्नलिखित ग्रीटिंगसर्वर प्रोग्राम एक सर्वर एप्लिकेशन का एक उदाहरण है जो कमांड-लाइन तर्क द्वारा निर्दिष्ट पोर्ट नंबर पर क्लाइंट के लिए सुनने के लिए सॉकेट क्लास का उपयोग करता है -

उदाहरण

// File Name GreetingServer.java
import java.net.*;
import java.io.*;

public class GreetingServer extends Thread {
   private ServerSocket serverSocket;
   
   public GreetingServer(int port) throws IOException {
      serverSocket = new ServerSocket(port);
      serverSocket.setSoTimeout(10000);
   }

   public void run() {
      while(true) {
         try {
            System.out.println("Waiting for client on port " + 
               serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            
            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress()
               + "\nGoodbye!");
            server.close();
            
         } catch (SocketTimeoutException s) {
            System.out.println("Socket timed out!");
            break;
         } catch (IOException e) {
            e.printStackTrace();
            break;
         }
      }
   }
   
   public static void main(String [] args) {
      int port = Integer.parseInt(args[0]);
      try {
         Thread t = new GreetingServer(port);
         t.start();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

क्लाइंट और सर्वर को संकलित करें और फिर सर्वर को निम्नानुसार शुरू करें -

$ java GreetingServer 6066
Waiting for client on port 6066...

ग्राहक कार्यक्रम की जाँच इस प्रकार है -

उत्पादन

$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!