जेव्हा आम्ही नेटवर्किंगबद्दल बोलतो, तेव्हा आम्ही OSI मॉडेलचा उल्लेख करण्यात अयशस्वी होऊ शकत नाही.

या मॉडेलच्या संदर्भात, आज आम्हाला ट्रान्सपोर्ट लेयर (4) मध्ये सर्वात जास्त रस आहे.

ही अशी पातळी आहे ज्यावर आम्ही "बिंदू A पासून बिंदू B पर्यंत" डेटा हलविण्यासह कार्य करतो. ट्रान्सपोर्ट लेयरचे मुख्य कार्य म्हणजे योग्य क्रम राखून संदेश गंतव्यस्थानापर्यंत पोहोचला आहे याची खात्री करणे. दोन सर्वात सामान्य वाहतूक स्तर प्रोटोकॉल आहेत: TCP आणि UDP. ते वेगवेगळ्या प्रकारे संकल्पनात्मकपणे कार्य करतात, परंतु प्रत्येकाचे स्वतःचे फायदे आहेत जे त्यांना विशिष्ट समस्या सोडविण्यास परवानगी देतात.

प्रथम, TCP कसे कार्य करते ते पाहू.

TCP (ट्रान्समिशन कंट्रोल प्रोटोकॉल) हा एक नेटवर्क प्रोटोकॉल आहे जो डेटाची देवाणघेवाण करण्यापूर्वी होस्टमधील कनेक्शन स्थापित केले आहे याची खात्री करतो.

हा एक अतिशय विश्वासार्ह प्रोटोकॉल आहे, कारण प्रत्येक वेळी ते दुसरे डेटा पॅकेट पाठवते तेव्हा, मागील पॅकेट प्राप्त झाले होते हे तपासणे आवश्यक आहे.

प्रसारित केलेले पॅकेट ऑर्डर केले जातात, आणि जर एखाद्या विशिष्ट पॅकेटमध्ये समस्या असतील (म्हणजे प्राप्त करणारा पक्ष पॅकेट आल्याची पुष्टी करत नाही), तर पॅकेट पुन्हा पाठवले जाते. परिणामी, हस्तांतरण दर तुलनेने कमी आहे, कारण कठोर देखरेखीसाठी आणि योग्य ऑर्डरिंग सुनिश्चित करण्यासाठी अधिक वेळ आवश्यक आहे.

इथेच त्याचा "भाऊ", UDP प्रोटोकॉल येतो. TCP च्या विपरीत, UDP प्रत्येक पॅकेटच्या ऑर्डर आणि स्थितीची खरोखर काळजी घेत नाही. हे फक्त वितरण पुष्टीकरणाशिवाय डेटा पाठवते. आणखी काय, ते कनेक्शन स्थापित करत नाही आणि कोणत्याही प्रकारे कनेक्शन स्थितीवर अवलंबून नाही.

त्याचा उद्देश फक्त पत्त्यावर डेटा पाठवणे हा आहे. आणि हे प्रोटोकॉलचे मुख्य नुकसान, कमी विश्वासार्हतेला जन्म देते, कारण ते फक्त डेटाचे तुकडे गमावू शकते. याव्यतिरिक्त, डेटा ऑर्डरच्या बाहेर येऊ शकतो या वस्तुस्थितीसाठी प्राप्तकर्ता तयार असणे आवश्यक आहे. ते म्हणाले, प्रोटोकॉलचा एक फायदा आहे, उच्च हस्तांतरण दर आहे, कारण प्रोटोकॉल डेटा पाठविण्यापुरता मर्यादित आहे.

डेटा स्वतः कसा प्रसारित केला जातो त्यामध्ये देखील फरक आहेत. TCP मध्ये, डेटा प्रवाहित केला जातो, याचा अर्थ डेटाला कोणतीही सीमा नसते. UDP मध्ये, डेटा डेटाग्राम म्हणून प्रसारित केला जातो आणि त्याला सीमा असतात आणि प्राप्तकर्ता डेटाची अखंडता तपासतो, परंतु संदेश यशस्वीरित्या प्राप्त झाल्यासच.

चला सारांश द्या:

TCP एक विश्वासार्ह आणि अचूक प्रोटोकॉल आहे जो डेटा गमावण्यापासून प्रतिबंधित करतो. संदेश नेहमी जास्तीत जास्त अचूकतेसह वितरित केला जाईल किंवा वितरित केला जाणार नाही. प्राप्तकर्त्याला डेटा ऑर्डर करण्यासाठी तर्काची आवश्यकता नाही, कारण येणारा डेटा आधीच ऑर्डर केला जाईल. UDP तितका विश्वासार्ह नाही, परंतु हा एक जलद डेटा ट्रान्सफर प्रोटोकॉल आहे. या प्रोटोकॉलसह कार्य करण्यासाठी पाठवणार्‍या आणि प्राप्त करणार्‍या पक्षांना काही अतिरिक्त तर्काची आवश्यकता असते. परंतु नेटवर्कवर खेळल्या जाणार्‍या संगणक गेम किंवा मोबाइल गेमचे उदाहरण वापरून ते कसे कार्य करते ते पाहू या. 5 सेकंदांपूर्वी काय पोहोचले असावे याची आम्हाला यापुढे काळजी वाटत नाही आणि जर ते वेळेवर पोहोचले नाहीत तर आम्ही काही पॅकेट वगळू शकतो — गेम मागे पडू शकतो, परंतु तरीही तुम्ही खेळू शकता!

Java मध्ये, UDP वर प्रसारित केलेल्या डेटाग्रामसह कार्य करण्यासाठी, आम्ही DatagramSocket आणि DatagramPacket क्लासेसचे ऑब्जेक्ट वापरतो.

डेटाची देवाणघेवाण करण्यासाठी, प्रेषक आणि प्राप्तकर्ता डेटाग्राम सॉकेट्स तयार करतात, म्हणजे डेटाग्राम सॉकेट क्लासची उदाहरणे. वर्गात अनेक कन्स्ट्रक्टर आहेत. तयार केलेले सॉकेट कोठे कनेक्ट होईल ते त्यांच्यातील फरक आहे:

डेटाग्राम सॉकेट () स्थानिक मशीनवर उपलब्ध असलेल्या कोणत्याही पोर्टशी कनेक्ट होते
डेटाग्राम सॉकेट (इंट पोर्ट) स्थानिक मशीनवर निर्दिष्ट पोर्टशी कनेक्ट होते
डेटाग्राम सॉकेट (इंट पोर्ट, इनेट अॅड्रेस अॅड्रेस) स्थानिक मशीन (addr) वरील पत्त्यावर निर्दिष्ट पोर्टशी कनेक्ट होते

वर्गात सॉकेट पॅरामीटर्समध्ये प्रवेश आणि व्यवस्थापित करण्याच्या अनेक पद्धती आहेत (आम्ही ते थोड्या वेळाने पाहू), तसेच डेटाग्राम प्राप्त करण्यासाठी आणि पाठविण्याच्या पद्धती:

पाठवा (डेटाग्राम पॅकेट पॅक) पॅकेटमध्ये पॅक केलेले डेटाग्राम पाठवते
प्राप्त (डेटाग्रामपॅकेट पॅक) पॅकेटमध्ये पॅक केलेले डेटाग्राम प्राप्त करते

DatagramPacket हा एक वर्ग आहे जो डेटाग्राम पॅकेजचे प्रतिनिधित्व करतो. डेटाग्राम पॅकेट्सचा वापर कनेक्शनरहित पॅकेट वितरण सेवा लागू करण्यासाठी केला जातो. प्रत्येक संदेश केवळ त्या पॅकेटमध्ये असलेल्या माहितीच्या आधारे एका मशीनमधून दुसर्‍या मशीनवर पाठविला जातो. एका मशीनवरून दुसर्‍या मशीनवर पाठविलेले अनेक पॅकेट्स वेगळ्या पद्धतीने राउट केले जाऊ शकतात आणि कोणत्याही क्रमाने येऊ शकतात. पॅकेट्सच्या वितरणाची खात्री नाही.

कन्स्ट्रक्टर:

डेटाग्रामपॅकेट(बाइट[] बुफ, इंट लांबी) लांबीचे पॅकेट स्वीकारण्यासाठी डेटाग्राम पॅकेट तयार करते .
DatagramPacket(byte[] buf, int length, InetAddress पत्ता, int पोर्ट) निर्दिष्ट होस्टवर निर्दिष्ट पोर्ट नंबरवर लांबीच्या लांबीचे पॅकेट पाठविण्यासाठी डेटाग्राम पॅकेट तयार करते .
DatagramPacket(byte[] buf, int ऑफसेट, int लांबी) बफरमध्ये ऑफसेट निर्दिष्ट करून, लांबीच्या लांबीचे पॅकेट स्वीकारण्यासाठी डेटाग्रामपॅकेट तयार करते .
DatagramPacket(byte[] buf, int ऑफसेट, int लांबी, InetAddress पत्ता, int पोर्ट) निर्दिष्ट होस्टवरील निर्दिष्ट पोर्ट क्रमांकावर ऑफसेट ऑफसेटसह लांबीच्या लांबीचे पॅकेट पाठविण्यासाठी डेटाग्राम पॅकेट तयार करते .
DatagramPacket(byte[] buf, int ऑफसेट, int लांबी, SocketAddress पत्ता) निर्दिष्ट होस्टवरील निर्दिष्ट पोर्ट क्रमांकावर ऑफसेट ऑफसेटसह लांबीच्या लांबीचे पॅकेट पाठविण्यासाठी डेटाग्राम पॅकेट तयार करते .
DatagramPacket(byte[] buf, int length, SocketAddress पत्ता) निर्दिष्ट होस्टवर निर्दिष्ट पोर्ट नंबरवर लांबीच्या लांबीचे पॅकेट पाठविण्यासाठी डेटाग्राम पॅकेट तयार करते .

आम्हाला आठवते की UDP दृष्टिकोन कनेक्शन स्थापित करत नाही. प्राप्तकर्ता त्यांच्या अपेक्षेने पॅकेट्स पाठवला जातो. परंतु तुम्ही DatagramSocket क्लासच्या connect(InetAddress addr, int port) पद्धतीचा वापर करून कनेक्शन स्थापित करू शकता .

पत्ता आणि पोर्टवर आधारित होस्टसह एक-मार्ग कनेक्शन स्थापित केले जाते: डेटाग्राम पाठविण्यासाठी किंवा प्राप्त करण्यासाठी. डिस्कनेक्ट() पद्धत वापरून कनेक्शन बंद केले जाऊ शकते .

डेटा प्राप्त करण्यासाठी डेटाग्रामसॉकेटवर आधारित सर्व्हर कोड लिहिण्याचा प्रयत्न करूया :


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

class Recipient {

   public static void main(String[] args) {
       try {
           DatagramSocket ds = new DatagramSocket(1050);

           while (true) {
               DatagramPacket pack = new DatagramPacket(new byte[5], 5);
               ds.receive(pack);
               System.out.println(new String(pack.getData()));
           }
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
}

आम्ही पोर्ट 1050 वर ऐकण्यासाठी DatagramSocket ऑब्जेक्ट तयार करतो. जेव्हा त्याला संदेश प्राप्त होतो, तेव्हा तो कन्सोलवर प्रिंट करतो. आम्ही "हॅलो" शब्द प्रसारित करू, म्हणून आम्ही बफरचा आकार पाच बाइट्सपर्यंत मर्यादित करतो.

आता आम्ही प्रेषक वर्ग तयार करू:


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

class Sender {
   private String host;
   private int port;

   Sender(String host, int port) {
       this.host = host;
       this.port = port;
   }

   private void sendMessage(String mes) {
       try {
           byte[] data = mes.getBytes();
           InetAddress address = InetAddress.getByName(host);
           DatagramPacket pack = new DatagramPacket(data, data.length, address, port);
           DatagramSocket ds = new DatagramSocket();
           ds.send(pack);
           ds.close();
       } catch (IOException e) {
           System.err.println(e);
       }
   }

   public static void main(String[] args) {
   Sender sender = new Sender("localhost", 1050);
   String message = "Hello";

   Timer timer = new Timer();
   timer.scheduleAtFixedRate(new TimerTask() {
       @Override
       public void run() {
           sender.sendMessage(message);
       }
   }, 1000, 1000);
}

}

sendMessage पद्धतीमध्ये , आम्ही DatagramPacket आणि DatagramSocket तयार करतो आणि आमचा संदेश पाठवतो. लक्षात ठेवा संदेश पाठवल्यानंतर डेटाग्रामसॉकेट बंद करण्यासाठी close() पद्धत वापरली जाते .

प्रत्येक सेकंदाला प्राप्तकर्त्याचे कन्सोल प्रेषकाने पाठवलेला येणारा "हॅलो" संदेश प्रदर्शित करतो. याचा अर्थ असा आहे की आमचे संप्रेषण सर्व योग्यरित्या कार्य करत आहे.