प्रौद्योगिकी साझेदारी

【JavaEE】जाल प्रोग्रामिंग——UDP

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
🤡🤡🤡个人主页🤡🤡🤡
🤡🤡🤡JavaEE专栏🤡🤡🤡

1. डाटाग्राम सॉकेट (UDP) .

१.१ विशेषताः

  1. संयोजनरहितम् : आँकडानां प्रसारणात् पूर्वं समर्पितं चैनलं स्थापयितुं आवश्यकता नास्ति तथा च गन्तव्यस्थानं प्राप्तुं स्वकीयं मार्गं चिनोति यथा सूचनां प्रेषयति तथा भवद्भिः केवलं सूचनां प्रेषयितुं आवश्यकता नास्ति तत् प्राप्तुं आवश्यकता अस्ति।
  2. अविश्वसनीयः संचरणः : दत्तांशसञ्चारकाले भवद्भिः अन्यपक्षेण प्राप्तः वा इति विषये ध्यानस्य आवश्यकता नास्ति, केवलं प्रेषयतु ।
  3. दत्तांशप्रवाहं प्रति उन्मुखम् : दत्तांशसञ्चारस्य मूलभूतं एककं प्रत्येकं UDP डाटाग्रामं भवति एकवारं पठित्वा लिखित्वा केवलं एकं सम्पूर्णं UDP डाटाग्रामं पठितुं लिखितुं च शक्यते ।
  4. पूर्ण-द्वैधः : एकस्मिन् लिङ्के द्विपक्षीयसञ्चारः सम्भवः ।

१.२ एन्कोडिंग्

Socket APIs सर्वे प्रणाल्याः प्रदत्ताः सन्ति भिन्न-भिन्न-प्रणालीभिः प्रदत्ताः APIs भिन्नाः सन्ति, परन्तु एते सिस्टम् APIs अधिकं जावा-मध्ये समाहिताः सन्ति ।
UDP मध्ये socket api द्वयोः वर्गयोः केन्द्रीभवति : DatagramSocket तथा ​​DatagramPacket इति

१.२.१डाटाग्रामसॉकेट्

अस्य वर्गस्य कार्यं "जालकार्डस्य संचालनाय" दूरनियन्त्रणरूपेण गणयितुं शक्यते, अर्थात् जालपत्रे पठनलेखनक्रियाः, यत् सञ्चिकावत् पठनं लेखनं च इति अवगन्तुं शक्यते
अनेकाः पद्धतयः प्रदत्ताः सन्ति- १.
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

१.२.२डाटाग्रामपैकेट

अयं वर्गः UDP डाटाग्रामस्य वर्णनं करोति ।

१.२.३ UDP (२४*७) प्रतिध्वनिसर्वरं कार्यान्वितं कुर्वन्तु

प्रतिध्वनिः : क्लायन्ट् सर्वरं प्रति भिन्नानि अनुरोधाः प्रेषयति, सर्वरः च भिन्नानि प्रतिक्रियाः प्रत्यागच्छति । परन्तु अत्र प्रतिध्वनिः क्लायन्ट् सर्वरं प्रति यत् अनुरोधं करोति तत् एव, सर्वरः च किमपि गणनां वा व्यापारयुक्तिं वा विना प्रतिक्रियां ददाति ।

public class udpEchoServer {
    public DatagramSocket socket = null;
    public udpEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }
    public void  start() throws IOException {
        System.out.println("服务器启动!!!");
        while (true) {
            //接受客户端请求
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
            //为了更好处理数据并方便打印,将接受的数据转化为字符串操作
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());
            //处理客户端的请求(算术计算或者业务逻辑)
            String response = this.process(request);
            //将处理完的请求返还给客户端
            DatagramPacket resposePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,
                    requestPacket.getSocketAddress());
            socket.send(resposePacket);
            //打印客户端的ip地址端口号和接收客户端的数据以及处理完客户端后的数据
            System.out.printf("[%s:%d] req = %s,resp = %sn",requestPacket.getAddress(),requestPacket.getPort(),
                    request,response);
        }
    }
    public String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        udpEchoServer udpEchoServer = new udpEchoServer(9999);
        udpEchoServer.start();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
DatagramPacket ऑब्जेक्ट् एकं डाटाग्रामं प्रतिनिधियति UDP डाटाग्रामः हेडर इत्यनेन पेलोड् इत्यनेन च निर्मितः भवति स्वयं प्रदत्तम्, अतः यथा भिक्षुः भिक्षां याचते, तथैव भवद्भिः भिक्षायाः कृते एकं कटोरा प्रदातव्यं, ततः प्रत्येकं परिवारः कटोरे भोजनं स्थापयति यतः डाटाग्रामस्य सारः द्विचक्रीयदत्तांशः अस्ति, अहं पेलोड्रूपेण बाइट् सरणीं प्रदत्तवान् .दत्तांशस्य संग्रहणम् ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
ग्राहकात् प्राप्तं दत्तांशं सर्वरेण संसाधितस्य अनन्तरं क्लायन्ट् प्रति प्रत्यागन्तुं भवति, अतः सर्वरेण संसाधितं दत्तांशं संग्रहीतुं DatagramPacket वस्तु निर्मातव्यं, ततः सर्वरः तत् क्लायन्ट् प्रति प्रेषयति अस्मिन् समये, DatagramPacket वस्तुनः रिक्तस्थानं प्रदातुं आवश्यकता नास्ति केवलं संसाधितं दत्तांशं अस्मिन् वस्तुनि स्थापयन्तु यतः दत्तांशं प्राप्य क्लायन्ट्-सङ्केतः पोर्ट्-सङ्ख्या च अभिलेखिता भवति क्लायन्ट् प्रति प्रेषयन्ते सति अभिलेखिताः भवन्ति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
यतः सर्वरः निश्चितः अस्ति, तस्मात् भवान् प्रत्यक्षतया पोर्ट् सङ्ख्यां सेट् कर्तुं शक्नोति यदा सर्वरः आरभ्यते तदा पोर्ट् सङ्ख्या निर्मीयते ।
मम किमर्थं पोर्ट् सङ्ख्या IP-सङ्केतः आवश्यकः ?
पक्षद्वयस्य मध्ये सफलसञ्चारं प्राप्तुं एते चत्वारः मूलसूचकाः अवश्यमेव उपस्थिताः भवेयुः : १.
स्रोत-पोर्ट्, स्रोत-IP, गन्तव्य-पोर्ट्, गन्तव्य-IP
एतेषां चतुर्णां मूलसूचकानाम् माध्यमेन द्वयोः पक्षयोः मध्ये संजालसञ्चारः प्राप्तुं शक्यते यतः क्लायन्ट् सर्वरः च एकस्मिन् होस्ट् मध्ये स्तः । वयं 172.0.0.1 इत्यस्य प्रतिनिधित्वार्थं IP इत्यस्य उपयोगं कर्तुं शक्नुमः, यत् loopback IP इति अपि ज्ञायते ।

१.२.४ UDP क्लायन्ट् कार्यान्वितम्

public class udpEchoClient {
    private DatagramSocket socket = null;
    private String serverIp;
    private int serverProt;
    public  udpEchoClient(String serverIp, int serverProt) throws SocketException {
        socket = new DatagramSocket();
        this.serverIp = serverIp;
        this.serverProt = serverProt;
    }
    public void start() throws IOException {
        System.out.println("客户端启动!");
        //1.从控制台获取字符串
        Scanner scanner = new Scanner(System.in);
        while(true) {
            System.out.println("请输入要发送的请求: ");
            String request = scanner.nextLine();
            //2.将输入的字符串发送给服务器,还要将发送的目标确定,IP和端口号
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), 0, request.getBytes().length,
                    InetAddress.getByName(serverIp), serverProt);
            socket.send(requestPacket);
            //3.从服务器读取到经过处理的响应
            DatagramPacket responsePackt = new DatagramPacket(new byte[4096], 4096);
            socket.receive(responsePackt);
            //将响应打印在控制台
            String response = new String(responsePackt.getData(), 0, responsePackt.getLength());
            System.out.println(response);
        }
    }
    public static void main(String[] args) throws IOException {
        udpEchoClient udpEchoClient = new udpEchoClient("127.0.0.1",9999);
        udpEchoClient.start();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
कन्सोल् तः प्राप्तस्य स्ट्रिंग् कृते requestPacket ऑब्जेक्ट् स्ट्रिंग् ऑब्जेक्ट् इत्यस्य सन्दर्भं दीर्घतां च प्राप्नोति, तथैव स्वस्य IP तथा Prot च प्राप्नोति, ततः सॉकेट् इत्यस्य send मेथड् इत्यनेन सर्वरं प्रति प्रेषयति
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
सर्वरतः प्रतिक्रियां प्राप्तुं भवद्भिः responsePackt ऑब्जेक्ट् निर्माय सर्वरतः प्राप्तं प्रतिक्रियां प्राप्तुं पूर्वमेव रिक्तं बाइट् एरे निर्मातव्यम् ।
केचन पद्धतयः भेदयन्तु : १.
विधिभेदात् पूर्वं बाइट्, वर्ण, एन्कोडिंग् फॉर्म इत्यादीनां अवधारणाः अवगन्तुं आवश्यकम्
बाइट्, वर्णाः च मूलतः द्विचक्रीयाः सन्ति, यत् 0101 इव दत्तांशः अस्ति, यतः सङ्गणकः केवलं 0101 इत्येतत् परिचिनोति ।
बाइट् : बाइट् दत्तांशसञ्चयस्य मूलभूतं एककं भवति १ बाइट् ८ बिट् भवति, यस्य अर्थः अस्ति यत् एकः बाइट् २५६ भिन्नानि मूल्यानि प्रतिनिधितुं शक्नोति ।
वर्णः : वर्णः पाठसूचनायाः प्रतिनिधित्वार्थं मूलभूतः एककः अस्ति दत्तांशं दत्तांशं च संग्रहयन्तु।
एन्कोडिंग् रूपम् : १.

  1. ASCII कोडः : आङ्ग्लवर्णानां प्रतिनिधित्वार्थं प्रयुक्तः ।१२८ वर्णानाम् (बृहत्-लघु-अक्षराणि, संख्याः, विरामचिह्नानि च केचन नियन्त्रण-वर्णाः च समाविष्टाः) प्रतिनिधित्वार्थं ७ बिट्-उपयोगं करोति, परन्तु चीनीयवर्णानां समर्थनं न करोति
  2. यूनिकोड् (UTF8): UTF-8 इति चर-दीर्घतायाः एन्कोडिंग्-रूपम् अस्ति यस्मिन् विश्वस्य सर्वेभ्यः लेखन-प्रणालीभ्यः वर्णाः सन्ति वर्णः १-४ वर्णानाम् अनुरूपः अस्ति ।
  3. GBK: चरदीर्घतायाः एन्कोडिंग् इत्यस्य उपयोगं करोति, मुख्यतया चीनीयवर्णसङ्केतनस्य कृते उपयुज्यते, एकः वर्णः १-२ बाइट् इत्यनेन सह सङ्गच्छते

विधिः भिन्नाः सन्ति- १.

  1. getBytes(): बाइट् सरणीयाः सन्दर्भं प्राप्नुवन्तु ।
  2. getBytes().length: बाइट् सरणीयाः दीर्घतां प्राप्नुत, वस्तु एकः वर्णः अस्ति
  3. getData(): यत् प्राप्यते तत् वर्णैः निर्मितस्य स्ट्रिंग् इत्यस्य सन्दर्भः अस्ति ।
  4. getLength(): प्राप्तस्य स्ट्रिंग् इत्यस्य दीर्घता, वस्तु बाइट् अस्ति
  5. getAddress(): IP पतां प्राप्नुत, वस्तु DatagramPacket अस्ति
  6. getPort(): Prot पोर्ट् सङ्ख्यां प्राप्नुवन्तु, वस्तु DatagramPacket अस्ति
  7. getSocketAddress(): IP पतां Prot पोर्ट् सङ्ख्यां च प्राप्नुवन्तु, वस्तु DatagramPacket अस्ति
  8. InetAddress.getByName(): एषा विधिः होस्ट्-नाम विश्लेषणं कृत्वा होस्ट्-नामस्य IP-सङ्केतं प्रत्यागन्तुं शक्नोति, अथवा प्रत्यक्षतया दत्तस्य IP-सङ्केतस्य InetAddress-वस्तुं प्रत्यागन्तुं शक्नोति, प्राप्तं InetAddress-वस्तु सर्वरं प्रति पारितं भवति, सर्वरः च समाधानं कर्तुं शक्नोति एतत् वस्तु प्राप्य IP इति ।

१.२.५ UDP शब्दकोशानुवादसर्वरं कार्यान्वितं कुर्वन्तु

अत्र वयम् अस्य सर्वरस्य कार्यान्वयनार्थं उत्तराधिकारस्य बहुरूपतायाश्च विचारान् प्रयोक्तुं शक्नुमः, यतः अस्य शब्दकोशस्य अनुवादसर्वरस्य प्रतिध्वनिसर्वरस्य च मध्ये अत्यावश्यकः अन्तरः प्रतिक्रियाणां संसाधनम् अस्ति, अतः वयं पुनरावृत्तिसङ्केतं उत्तराधिकारं प्राप्य पुनः उपयोगं कर्तुं शक्नुमः तथा च आवश्यकं कोडं विस्तारयितुं शक्नुमः

public class udpDictServer extends udpEchoServer{
    HashMap<String,String> map = null;
    public udpDictServer(int port) throws SocketException {
        super(port);
        map = new HashMap<>();
        map.put("server","服务");
        map.put("client","客户端");
        map.put("cat","🐱");
        map.put("dog","🐕");
        map.put("pig","🐖");
    }
    @Override
    public String process(String request) {
        return map.getOrDefault(request, "该词汇没有查询到");
    }

    public static void main(String[] args) throws IOException {
        udpDictServer udpDictServer = new udpDictServer(9999);
        udpDictServer.start();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

एतत् शब्दकोशानुवादं कार्यान्वितुं भवद्भिः दत्तांशसंरचने नक्शा अपि आवश्यकं भवति, तथा च दत्तांशसङ्ग्रहार्थं मानचित्रे कील-मूल्ययुग्मानां उपयोगः भवति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
ततः विशिष्टव्यापारसञ्चालनेषु केवलं प्रक्रियाविधिः पुनर्लेखनस्य आवश्यकता भवति ।
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
अत्र निष्पादनकाले यद्यपि एतत् मातापितृवर्गस्य udpEchoServer वस्तुं निर्दिशति, यतः udpDictServer उपवर्गः udpEchoServer मातापितृवर्गं उत्तराधिकारं प्राप्नोति तथा च प्रक्रियाविधिं अधिलिखति, बहुरूपीविशेषतायाः कारणेन निष्पादितः प्रक्रियाविधिः वस्तुतः उपवर्गस्य प्रक्रिया अस्ति

2. क्लायन्ट् तथा सर्वर प्रक्रिया

  1. कन्सोल् तः दत्तांशं प्राप्नुवन्तु
  2. क्लायन्ट् सर्वरं प्रति दत्तांशं प्रेषयति
  3. सर्वरः ग्राहकेन प्रेषितं दत्तांशं प्राप्नोति
  4. प्रतिक्रियायाः गणनां कुरुत
  5. सर्वरः गणितप्रतिसादं क्लायन्ट् प्रति प्रेषयति
  6. ग्राहकः सर्वरेण प्रेषितं प्रतिक्रियां प्राप्नोति
  7. क्लायन्ट् इत्यस्मात् प्राप्तात् सर्वरात् प्रेषितं प्रतिक्रियां कन्सोल् प्रति मुद्रयति