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

जावा उन्नत कुंजी ज्ञान बिन्दु-23-जाल प्रोग्रामिंग

2024-07-12

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

संजालप्रोग्रामिंगस्य परिचयः

सॉफ्टवेयर संरचना

  • C/S structure: पूर्णं नाम Client/Server structure अस्ति, यत् client तथा ​​server structure इति निर्दिशति ।
  • B/S structure: पूर्णं नाम Browser/Server structure अस्ति, यत् ब्राउजर् तथा सर्वर संरचनां निर्दिशति ।

संजाल संचार प्रोटोकॉल

网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信。

  • TCP/IP प्रोटोकॉल: संचरणनियन्त्रणप्रोटोकॉल/अन्तर्जालप्रोटोकॉल (संचरणनियन्त्रणप्रोटोकॉल/अन्तर्जालप्रोटोकॉल), अस्ति
    अन्तर्जालस्य मूलभूततमः व्यापकः च प्रोटोकॉलः ।
    अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

प्रोटोकॉल वर्गीकरण

java.net 包中提供了两种常见的网络协议的支持

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

TCP इत्यस्मिन् त्रिपक्षीयहस्तप्रहारः : १. TCP प्रोटोकॉलमध्ये, दत्तांशप्रेषणस्य सज्जतापदे, संयोजनस्य विश्वसनीयतां सुनिश्चित्य क्लायन्ट्-सर्वरयोः मध्ये त्रीणि अन्तरक्रियाणि भवन्ति

  • प्रथमे हस्तप्रहारे क्लायन्ट् सर्वरं प्रति संयोजनानुरोधं प्रेषयति, सर्वरात् पुष्टिं प्रतीक्षते च ।
  • द्वितीयहस्तप्रयोगे सर्वरः क्लायन्ट् प्रति प्रतिक्रियां प्रेषयति, क्लायन्ट् इत्यस्मै सूचयति यत् संयोजनानुरोधः प्राप्तः इति ।
  • तृतीये हस्तप्रहारे क्लायन्ट् पुनः सर्वरं प्रति पुष्टिकरणसूचनाः प्रेषयति यत् संयोजनस्य पुष्ट्यर्थं भवति ।

नेटवर्क् प्रोग्रामिंग् इत्यस्य त्रयः तत्त्वानि

  1. प्रोटोकॉलः - सङ्गणकजालसञ्चारस्य नियमाः येषां पालनम् अवश्यं कर्तव्यम्
  2. IP-सङ्केतः : अन्तर्जाल-प्रोटोकॉल-सङ्केतं निर्दिशति, यत् सामान्यतया IP इति नाम्ना प्रसिद्धम् । जालपुटे सङ्गणकयन्त्राणां विशिष्टरूपेण संख्यां दातुं IP-सङ्केतानां उपयोगः भवति ।
  • IPv4: एषा ३२-बिट् द्विचक्रीयसङ्ख्या अस्ति, प्रायः ४ बाइट्-रूपेण विभक्ता, abcd-रूपेण व्यक्ता, यथा १९२.१६८.६५.१०० । तेषु a, b, c, d च सर्वे 0 तः 255 पर्यन्तं दशमलवपूर्णाङ्काः सन्ति, अतः 4.2 अरबपर्यन्तं प्रतिनिधित्वं कर्तुं शक्यते ।
  • १२८-बिट्-पतेः-दीर्घतायाः उपयोगेन, १६ बाइट्-समूहस्य प्रत्येकं समूहं षट्-दशमलव-सङ्ख्यानां ८ समूहेषु विभक्तं भवति, यत् ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 इति रूपेण व्यक्तं भवति, यत् अपर्याप्तजाल-सङ्केत-सम्पदां समस्यायाः समाधानं करोति .
    सामान्यतया प्रयुक्ताः आदेशाः : १.
  • ipconfig [स्थानीयं IP-सङ्केतं पश्यन्तु] ।
    अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
  • अन्तरिक्षस्य IP-सङ्केतं पिंगं कुर्वन्तु [जालं सम्बद्धं वा इति पश्यन्तु] ।
  1. पोर्ट् सङ्ख्या
  • द्वयोः बाइट्-द्वारा प्रतिनिधित्वं कृतं पूर्णाङ्कं, तस्य मूल्यपरिधिः 0 ~ 65535 अस्ति ।तेषु ० तः १०२३ पर्यन्तं पोर्ट्-सङ्ख्याः केभ्यः प्रसिद्धैः जालपुटैः उपयुज्यन्ते
    संजालसेवाः अनुप्रयोगाः च, साधारणानुप्रयोगेषु १०२४ तः उपरि पोर्टसङ्ख्यानां उपयोगः आवश्यकः । यदि पोर्ट् सङ्ख्या अन्येन सेवायाः अथवा अनुप्रयोगेन आक्रान्तः अस्ति तर्हि वर्तमानः कार्यक्रमः आरम्भं कर्तुं असफलः भविष्यति ।
    जालपुटे प्रक्रियाः चिनुत : १. 协议 + IP地址 + 端口号

TCP संचार कार्यक्रम

TCP通信能实现两台计算机之间的数据交互,通信的两端,要严格区分为客户端(Client)与服务端(Server)。

संचारपदार्थाः

  • सर्वर प्रोग्राम् पूर्वमेव आरभ्य क्लायन्ट्-सम्बद्धस्य प्रतीक्षां करोति ।
  • क्लायन्ट् सक्रियरूपेण सर्वरेण सह सम्बद्धः भवति तथा च संयोजनं सफलं भवति चेत् एव संवादं कर्तुं शक्नोति । सर्वरः सक्रियरूपेण क्लायन्ट्-सङ्गतिं कर्तुं न शक्नोति ।

जावा मध्ये TCP संचारकार्यक्रमस्य कार्यान्वयनार्थं द्वौ वर्गौ प्रदत्तौ स्तः :

  1. क्लायन्ट् : java.net.Socket वर्गेन प्रतिनिधितः । Socket ऑब्जेक्ट् रचयन्तु, सर्वरं प्रति संयोजनानुरोधं प्रेषयन्तु, सर्वरः अनुरोधस्य प्रतिक्रियां ददाति, तौ च संयोजनं स्थापयित्वा संचारं आरभत ।
  2. सर्वरः: java.net.ServerSocket वर्गेन प्रतिनिधितः । ServerSocket ऑब्जेक्ट् इत्यस्य निर्माणं सेवां आरभ्य क्लायन्ट् इत्यस्य संयोजनस्य प्रतीक्षायाः बराबरम् अस्ति ।

सॉकेट् वर्गः

Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
निर्माणविधिः : १.
public Socket(String host, int port) :एकं सॉकेट् ऑब्जेक्ट् रचयति तथा च निर्दिष्टे होस्ट् इत्यत्र निर्दिष्टेन पोर्ट् सङ्ख्यायाः सह संयोजयति । यदि निर्दिष्टः होस्ट् शून्यः अस्ति तर्हि निर्दिष्टसङ्केतस्य लूपबैकसङ्केतः (लूपबैक-सङ्केतः (127.xxx) स्थानीय-लूप्बैक्-सङ्केतः (Loopback Address) अस्ति ।)。
सदस्यविधयः : १.

  • public InputStream getInputStream() : अस्य सॉकेट् कृते निवेशप्रवाहं प्रत्यागच्छति ।
  • public OutputStream getOutputStream() : अस्य सॉकेट् कृते आउटपुट् स्ट्रीम् प्रत्यागच्छति ।
  • public void close() : एतत् सॉकेटं पिधाय।
  • public void shutdownOutput() : अस्य सॉकेट् कृते आउटपुट् स्ट्रीम् अक्षमम् करोति ।

ServerSocket वर्गः

ServerSocket 类:这个类实现了服务器套接字,该对象等待通过网络的请求。
निर्माणविधिः : १.
public ServerSocket(int port): ServerSocket ऑब्जेक्ट् निर्मायन्ते सति सूचकेन सह बाइण्ड् कर्तुं एतस्य कन्स्ट्रक्टर् इत्यस्य उपयोगं कुर्वन्तु ।
कस्मिंश्चित् पोर्ट् सङ्ख्यायां पैरामीटर् पोर्ट् पोर्ट् सङ्ख्या भवति ।
सदस्यविधयः : १.
public Socket accept() : संयोजनानि शृणुत स्वीकुर्वन्तु, तथा च क्लायन्ट् इत्यनेन सह संचारार्थं नूतनं Socket ऑब्जेक्ट् प्रत्यागच्छन्तु ।एषः विधिः
यावत् संयोजनं न स्थापितं तावत् अवरुद्धं करिष्यति।

सरलः TCP संजालकार्यक्रमः

TCP संचार विश्लेषणम् : १.

  1. [Server] आरभ्य, ServerSocket ऑब्जेक्ट् रचयन्तु, संयोजनस्य प्रतीक्षां च कुर्वन्तु ।
  2. [Client] आरभ्य, Socket ऑब्जेक्ट् रचयन्तु, संयोजनस्य अनुरोधं च कुर्वन्तु ।
  3. [Server] संयोजनं प्राप्नोति, accept मेथड् आह्वयति, Socket ऑब्जेक्ट् च प्रत्यागच्छति ।
  4. [Client] Socket object, OutputStream प्राप्नोति, सर्वरे data लिखति च ।
  5. [Server] Socket object, InputStream प्राप्नोति, क्लायन्ट् द्वारा प्रेषितं दत्तांशं च पठति ।
  6. [Server] Socket object, OutputStream प्राप्नोति, क्लायन्ट् प्रति पुनः data लिखति च ।
  7. [Client] Scoket ऑब्जेक्ट्, InputStream प्राप्नोति, डेटा पार्सं करोति, पुनः लिखति च ।
  8. [ग्राहकः] संसाधनं मुक्तं कृत्वा विच्छेदं कुर्वन्तु।

कोड उदाहरणम् : १.

  • सेवा-अन्तस्थानम् : १.
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerTCP {
    public static void main(String[] args) throws IOException {
        System.out.println("服务端启动 , 等待连接 .... ");
        // 1.创建 ServerSocket对象,绑定端口,开始等待连接
        ServerSocket ss = new ServerSocket(6666);
        // 2.接收连接 accept 方法, 返回 socket 对象.
        Socket server = ss.accept();
        // 3.通过socket 获取输入流
        InputStream is = server.getInputStream();
        // 4.一次性读取数据
        // 4.1 创建字节数组
        byte[] b = new byte[1024];
        // 4.2 据读取到字节数组中.
        int len = is.read(b);
        // 4.3 解析数组,打印字符串信息
        String msg = new String(b, 0, len);
        System.out.println(msg);
        //5.关闭资源.
        is.close();
        server.close();
    }
}
  • 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

सर्वरः पोर्ट् सङ्ख्यां निर्दिशति, accept() मेथड् मार्गेण Socket ऑब्जेक्ट् प्राप्नोति, क्लायन्ट् ऑब्जेक्ट् इत्यस्य माध्यमेन इनपुट् स्ट्रीम् प्राप्नोति, अन्ते च दत्तांशं पठति, क्लायन्ट् द्वारा प्रेषितस्य सन्देशस्य प्रतीक्षां करोति च

  • ग्राहिका
import java.net.Socket;

public class ClientTCP {
    public static void main(String[] args) throws Exception {
        System.out.println("客户端 发送数据");
        // 1.创建 Socket ( ip , port ) , 确定连接到哪里.
        Socket client = new Socket("localhost", 6666);
        // 2.获取流对象 . 输出流
        OutputStream os = client.getOutputStream();
        // 3.写出数据.
        os.write("你好么? tcp ,我来了".getBytes());
        // 4. 关闭资源 .
        os.close();
        client.close();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

यदा क्लायन्ट् निर्मितः भवति तदा सर्वरेण सह संयोजनस्य सुविधायै संयोजनस्य IP-सङ्केतं पोर्ट्-सङ्ख्यां च निर्दिशन्तु, क्लायन्ट् Socket ऑब्जेक्ट् मार्गेण आउटपुट् स्ट्रीम्, आउटपुट् डाटा च प्राप्नुवन्तु
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु

सञ्चिका अपलोड् [Extended] .

  1. [क्लायन्ट्] इन्पुट् स्ट्रीम, हार्डडिस्कतः प्रोग्राम् मध्ये सञ्चिकादत्तांशं पठन्तु ।
  2. [क्लायन्ट्] आउटपुट् स्ट्रीम, सर्वरं प्रति सञ्चिकादत्तांशं लिखतु ।
  3. [Server] इनपुट् स्ट्रीम, सर्वर प्रोग्राम् प्रति सञ्चिकादत्तांशं पठन्तु ।
  4. [Server] आउटपुट् स्ट्रीम, सर्वर हार्ड डिस्क मध्ये सञ्चिकादत्तांशं लिखन्तु ।
  5. [Server] आउटपुट् स्ट्रीम प्राप्त्वा दत्तांशं पुनः लिखन्तु ।
  6. [Client] इनपुट् स्ट्रीम प्राप्त्वा दत्तांशं पार्स कृत्वा पुनः लिखन्तु ।

数据准备:D ड्राइव् इत्यस्य अधः test.jpg इति सञ्चिकां स्थापयित्वा परीक्षणपुटं रचयन्तु

कोड उदाहरणम् : १.

  • सर्वर
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class FileUpload_Server {
    public static void main(String[] args) throws IOException {
        System.out.println("服务器 启动..... ");
        // 1. 创建服务端ServerSocket
        ServerSocket serverSocket = new ServerSocket(6666);
        // 2. 循环接收,建立连接
        while (true) {
        Socket accept = serverSocket.accept();
            /* 3. socket对象交给子线程处理,进行读写操作Runnable接口中,只有一个run方法,使用lambda表达式简化格式 */
            new Thread(() -> {
                try (   //3.1 获取输入流对象
                        BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
                        //3.2 创建输出流对象, 保存到本地 .
                        FileOutputStream fis = new FileOutputStream("D:/test/" + System.currentTimeMillis() + ".jpg");
                        BufferedOutputStream bos = new BufferedOutputStream(fis)) {
                    // 3.3 读写数据
                    byte[] b = new byte[1024 * 8];
                    int len;
                    while ((len = bis.read(b)) != -1) {
                        bos.write(b, 0, len);
                    }

                    // 4.=======信息回写===========================
                    System.out.println("back ........");
                    OutputStream out = accept.getOutputStream();
                    out.write("上传成功".getBytes());
                    out.close();

                    //5. 关闭 资源
                    bos.close();
                    bis.close();
                    accept.close();
                    System.out.println("文件上传已保存");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).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
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

अत्र वयं प्रथमं सर्वर-वस्तु निर्मामः, सर्वरेण सह निरन्तरं संयोजनं सुनिश्चित्य while(true) इत्यस्य उपयोगं कुर्मः, ततः यदा कश्चन उपयोक्ता महतीं सञ्चिकां अपलोड् करोति तदा अन्येषां उपयोक्तृणां सञ्चिकाः अपलोड् करणस्य कार्यक्षमता प्रभाविता न भविष्यति इति सुनिश्चित्य एकं थ्रेड् आरभामः अपलोड्-काले समानसञ्चिकानामकारणात् सञ्चिकानाम अधिलिखितं न भविष्यति इति सुनिश्चित्य सञ्चिकानाम सेट् कर्तुं system milliseconds + '.jpg' इत्यस्य उपयोगं कुर्वन्तु ।

  • ग्राहिका
import java.io.*;
import java.net.Socket;

public class FileUpload_Client {
    public static void main(String[] args) throws IOException {
        // 1.创建流对象
        // 1.1 创建输入流,读取本地文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:\test.jpg"));
        // 1.2 创建输出流,写到服务端
        Socket socket = new Socket("localhost", 6666);
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        //2.写出数据.
        byte[] b = new byte[1024 * 8 ];
        int len ;
        while (( len = bis.read(b))!=-1) {
            bos.write(b, 0, len);
        }
        // 关闭输出流,通知服务端,写出数据完毕
        socket.shutdownOutput();
        System.out.println("文件发送完毕");   
        // 3. =====解析回写============
        InputStream in = socket.getInputStream();
        byte[] back = new byte[20];
        in.read(back);
        System.out.println(new String(back));
        in.close();
        // ============================
        // 4.释放资源
        socket.close();
        bis.close();
    }
}
  • 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

अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
अत्र चित्रविवरणं सम्मिलितं कुर्वन्तु
अत्र वयं द्रष्टुं शक्नुमः यत् अस्माकं सर्वरेण उपयोक्त्रा प्रेषिता सञ्चिका हार्डडिस्क मध्ये सफलतया रक्षिता ।

जावा-प्रेमिणः लेखस्य विषये ज्ञातुं स्वागतं कुर्वन्ति लेखकः तस्य अद्यतनीकरणं निरन्तरं करिष्यति तथा च भवतः ध्यानं संग्रहणं च प्रतीक्षते। . .