Teknologian jakaminen

Java Advanced Key Knowledge Points-23-Network Programming

2024-07-12

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

Johdatus verkko-ohjelmointiin

ohjelmiston rakenne

  • C/S-rakenne: Koko nimi on Client/Server -rakenne, joka viittaa asiakas- ja palvelinrakenteeseen.
  • B/S-rakenne: Koko nimi on Browser/Server structure, joka viittaa selaimen ja palvelimen rakenteeseen.

Verkkoviestintäprotokolla

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

  • TCP/IP-protokolla: Transmission Control Protocol/Internet Protocol (Transmission Control Protocol/Internet Protocol), on
    Internetin yksinkertaisin ja yleisin protokolla.
    Lisää kuvan kuvaus tähän

Protokollaluokitus

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

  1. TCP: Transmission Control Protocol. TCP-protokolla on yhteyssuuntautunut tiedonsiirtoprotokolla, eli ennen tiedon lähettämistä muodostetaan looginen yhteys lähetyspään ja vastaanottavan pään välille, jonka jälkeen data välitetään. Se mahdollistaa luotettavan ja virheettömän tiedonsiirron kahden välillä tietokoneita.
  2. UDP: User Datagram Protocol. UDP-protokolla on yhteydetön protokolla. Dataa siirrettäessä yhteyttä ei tarvitse muodostaa riippumatta siitä, onko toisen osapuolen palvelu käynnistetty, data, tietolähde ja kohde kapseloidaan suoraan datapakettiin ja lähetetään suoraan. Kunkin paketin koko on rajoitettu 64 kt. Se on epäluotettava protokolla, koska yhteyttä ei ole, joten siirtonopeus on nopea, mutta tiedot katoavat helposti.

Kolmisuuntainen kättely TCP:ssä: TCP-protokollassa tiedon lähetyksen valmisteluvaiheessa asiakkaan ja palvelimen välillä on kolme vuorovaikutusta yhteyden luotettavuuden varmistamiseksi.

  • Ensimmäisessä kättelyssä asiakas lähettää yhteyspyynnön palvelimelle ja odottaa vahvistusta palvelimelta.
  • Toisessa kättelyssä palvelin lähettää vastauksen takaisin asiakkaalle ilmoittaen asiakkaalle, että yhteyspyyntö on vastaanotettu.
  • Kolmannessa kättelyssä asiakas lähettää vahvistustiedot palvelimelle uudelleen yhteyden vahvistamiseksi.

Verkko-ohjelmoinnin kolme elementtiä

  1. Protokolla: Säännöt, joita tietokoneverkkoviestinnän on noudatettava
  2. IP-osoite: viittaa Internet Protocol Address -osoitteeseen, joka tunnetaan yleisesti nimellä IP. IP-osoitteita käytetään verkossa olevien tietokonelaitteiden yksilölliseen numerointiin.
  • IPv4: Se on 32-bittinen binääriluku, joka on yleensä jaettu 4 tavuun ja joka ilmaistaan ​​muodossa abcd, kuten 192.168.65.100. Niiden joukossa a, b, c ja d ovat kaikki desimaalilukuja välillä 0 - 255, joten jopa 4,2 miljardia voidaan esittää.
  • Käyttämällä 128-bittistä osoitepituutta jokainen 16 tavun ryhmä jaetaan 8 heksadesimaalilukujen ryhmään, jotka ilmaistaan ​​muodossa ABCD:EF01:2345:6789:ABCD:EF01:2345:6789, mikä ratkaisee verkko-osoiteresurssien riittämättömyyden. .
    Yleisesti käytetyt komennot:
  • ipconfig [Näytä paikallinen IP-osoite]
    Lisää kuvan kuvaus tähän
  • Ping tilan IP-osoite [tarkista, onko verkko kytketty]
  1. Portin numero
  • Kahden tavun edustama kokonaisluku, jonka arvoalue on 0 ~ 65535.Niiden joukossa porttinumeroita välillä 0 - 1023 käytetään joissakin tunnetuissa verkoissa
    Verkkopalvelujen ja sovellusten, tavallisten sovellusten on käytettävä porttinumeroita, jotka ovat yli 1024. Jos porttinumero on toisen palvelun tai sovelluksen varassa, nykyinen ohjelma ei käynnisty.
    Tunnista verkon prosessit: 协议 + IP地址 + 端口号

TCP-viestintäohjelma

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

Viestintävaiheet

  • Palvelinohjelma pitää käynnistää etukäteen ja odottaa asiakkaan yhteyttä.
  • Asiakas muodostaa aktiivisesti yhteyden palvelimeen ja voi kommunikoida vain, jos yhteys onnistuu. Palvelin ei voi muodostaa aktiivisesti yhteyttä asiakkaaseen.

Javassa on kaksi luokkaa TCP-viestintäohjelmien toteuttamiseen:

  1. Asiakas: Edustaa java.net.Socket-luokka. Luo Socket-objekti, lähetä yhteyspyyntö palvelimelle, palvelin vastaa pyyntöön ja molemmat muodostavat yhteyden ja aloittavat yhteydenpidon.
  2. Palvelin: edustaa luokka java.net.ServerSocket. ServerSocket-objektin luominen vastaa palvelun käynnistämistä ja asiakkaan yhteyden muodostamisen odottamista.

Pistorasialuokka

Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
Rakennusmenetelmä:
public Socket(String host, int port) :Luo socket-objektin ja yhdistää sen määritetyn isännän määritettyyn porttinumeroon. Jos määritetty isäntä on tyhjä, se vastaa määritettyä osoitetta, joka on silmukkaosoite (Palautusosoite (127.xxx) on paikallissilmukkaosoite (Loopback Address))。
Jäsenmenetelmät:

  • public InputStream getInputStream() : Palauttaa tämän liittimen tulovirran.
  • public OutputStream getOutputStream() : Palauttaa tämän liittimen lähtövirran.
  • public void close() : Sulje tämä liitäntä.
  • public void shutdownOutput() : Poistaa tämän liittimen lähtövirran käytöstä.

ServerSocket-luokka

ServerSocket 类:这个类实现了服务器套接字,该对象等待通过网络的请求。
Rakennusmenetelmä:
public ServerSocket(int port): Tämän rakentajan avulla voit sitoa sen osoittimeen luotaessa ServerSocket-objektia.
Tietyssä portin numerossa parametriportti on portin numero.
Jäsenmenetelmät:
public Socket accept() : Kuuntele ja hyväksy yhteydet ja palauta uusi Socket-objekti viestintää varten asiakkaan kanssa.tätä menetelmää
Estää, kunnes yhteys on muodostettu.

Yksinkertainen TCP-verkkoohjelma

TCP-viestintäanalyysi:

  1. [Palvelin] Käynnistä, luo ServerSocket-objekti ja odota yhteyttä.
  2. [Client] Käynnistä, luo Socket-objekti ja pyydä yhteyttä.
  3. [Palvelin] vastaanottaa yhteyden, kutsuu hyväksymismenetelmän ja palauttaa Socket-objektin.
  4. [Client] Socket-objekti, hankkii OutputStreamin ja kirjoittaa tiedot palvelimelle.
  5. [Palvelin] Socket-objekti, hankkii InputStreamin ja lukee asiakkaan lähettämät tiedot.
  6. [Palvelin] Socket-objekti, hankkii OutputStreamin ja kirjoittaa tiedot takaisin asiakkaalle.
  7. [Client] Scoket-objekti, hankkii InputStreamin, jäsentää ja kirjoittaa takaisin tiedot.
  8. [Asiakas] Vapauta resurssit ja katkaise yhteys.

Esimerkki koodista:

  • Palvelupääte:
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

Palvelin määrittää portin numeron, hankkii Socket-objektin accept()-menetelmällä, hakee syöttövirran asiakasobjektin kautta ja lukee lopuksi tiedot ja odottaa asiakkaan lähettämää viestiä.

  • asiakas
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

Kun asiakas on luotu, määritä yhteyden IP-osoite ja portin numero helpottaaksesi yhteyden muodostamista palvelimeen, saadaksesi lähtövirta ja lähtötiedot asiakkaan Socket-objektin kautta.
Lisää kuvan kuvaus tähän

Tiedoston lataus [laajennettu]

  1. [Client] Syötä virta, lue tiedostotiedot kiintolevyltä ohjelmaan.
  2. [Client] Tulosta virta, kirjoita tiedostotiedot palvelimelle.
  3. [Palvelin] Syötä virta, lue tiedostotiedot palvelinohjelmaan.
  4. [Palvelin] Tulostaa virtaa, kirjoita tiedostotiedot palvelimen kiintolevylle.
  5. [Palvelin] Hanki lähtövirta ja kirjoita tiedot takaisin.
  6. [Client] Hanki syöttövirta ja jäsennä ja kirjoita tiedot takaisin.

数据准备:Aseta tiedosto nimeltä test.jpg D-aseman alle ja luo testikansio

Esimerkki koodista:

  • Palvelin
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

Täällä luomme ensin palvelinobjektin, käytämme while(true)-toimintoa varmistaaksemme jatkuvan yhteyden palvelimeen ja aloitamme sitten säikeen varmistaaksemme, että kun käyttäjä lataa suuren tiedoston, se ei vaikuta muiden tiedostoja lataavien käyttäjien tehokkuuteen. Käytä järjestelmän millisekuntia + '.jpg' asettaaksesi tiedoston nimen varmistaaksesi, että tiedoston nimi ei korvaudu saman tiedostonimen vuoksi latauksen aikana.

  • asiakas
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

Lisää kuvan kuvaus tähän
Lisää kuvan kuvaus tähän
Tästä näemme, että palvelimemme onnistui tallentamaan käyttäjän lähettämän tiedoston kiintolevylle.

Java-ystävät ovat tervetulleita tutustumaan artikkeliin. Kirjoittaja päivittää sitä edelleen ja odottaa huomiotasi ja kokoelmaasi. . .