Condivisione della tecnologia

Punti di conoscenza chiave avanzati Java-23-Programmazione di rete

2024-07-12

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

Introduzione alla programmazione di rete

struttura del software

  • Struttura C/S: il nome completo è struttura Client/Server, che si riferisce alla struttura client e server.
  • Struttura B/S: il nome completo è struttura Browser/Server, che si riferisce alla struttura del browser e del server.

Protocollo di comunicazione di rete

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

  • Protocollo TCP/IP: Protocollo di controllo della trasmissione/Protocollo Internet (Protocollo di controllo della trasmissione/Protocollo Internet), è
    Il protocollo più basilare e diffuso di Internet.
    Inserisci qui la descrizione dell'immagine

Classificazione del protocollo

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

  1. TCP: protocollo di controllo della trasmissione. Il protocollo TCP è un protocollo di comunicazione orientato alla connessione, ovvero prima di trasmettere i dati viene stabilita una connessione logica tra l'estremità di invio e l'estremità di ricezione, quindi i dati vengono trasmessi tra i due computer.
  2. UDP: protocollo datagramma utente. Il protocollo UDP è un protocollo senza connessione. Durante la trasmissione dei dati non è necessario stabilire una connessione, indipendentemente dal fatto che il servizio dell'interlocutore sia avviato, i dati, la fonte dei dati e la destinazione vengono incapsulati direttamente nel pacchetto di dati e inviati direttamente. La dimensione di ciascun pacchetto è limitata a 64k. È un protocollo inaffidabile perché non c'è connessione, quindi la velocità di trasmissione è elevata, ma i dati si perdono facilmente.

Handshake a tre vie in TCP: Nel protocollo TCP, nella fase di preparazione dell'invio dei dati, ci sono tre interazioni tra il client e il server per garantire l'affidabilità della connessione.

  • Nel primo handshake il client invia una richiesta di connessione al server e attende la conferma da parte del server.
  • Nel secondo handshake, il server invia una risposta al client, notificandogli che la richiesta di connessione è stata ricevuta.
  • Nel terzo handshake, il client invia nuovamente le informazioni di conferma al server per confermare la connessione.

Tre elementi della programmazione di rete

  1. Protocollo: le regole a cui devono attenersi le comunicazioni di rete di computer
  2. Indirizzo IP: si riferisce all'indirizzo del protocollo Internet, comunemente noto come IP. Gli indirizzi IP vengono utilizzati per numerare in modo univoco i dispositivi informatici su una rete.
  • IPv4: è un numero binario a 32 bit, solitamente diviso in 4 byte, espresso sotto forma di abcd, come 192.168.65.100. Tra questi, a, b, c e d sono tutti numeri interi decimali compresi tra 0 e 255, quindi è possibile rappresentare fino a 4,2 miliardi.
  • Utilizzando una lunghezza dell'indirizzo di 128 bit, ciascun gruppo di 16 byte è diviso in 8 gruppi di numeri esadecimali, espressi come ABCD:EF01:2345:6789:ABCD:EF01:2345:6789, che risolve il problema delle risorse di indirizzo di rete insufficienti. .
    Comandi comunemente usati:
  • ipconfig [Visualizza l'indirizzo IP locale]
    Inserisci qui la descrizione dell'immagine
  • Effettua il ping dell'indirizzo IP dello spazio [controlla se la rete è connessa]
  1. Il numero di porta
  • Un numero intero rappresentato da due byte, il suo intervallo di valori è 0 ~ 65535.Tra questi, i numeri di porta compresi tra 0 e 1023 sono utilizzati da alcune reti ben note
    Servizi e applicazioni di rete, le applicazioni ordinarie devono utilizzare numeri di porta superiori a 1024. Se il numero di porta è occupato da un altro servizio o applicazione, il programma corrente non verrà avviato.
    Identificare i processi nella rete: 协议 + IP地址 + 端口号

Programma di comunicazione TCP

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

Passaggi di comunicazione

  • Il programma server deve essere avviato in anticipo e attende la connessione del client.
  • Il client si connette attivamente al server e può comunicare solo se la connessione ha esito positivo. Il server non può connettersi attivamente al client.

In Java vengono fornite due classi per implementare i programmi di comunicazione TCP:

  1. Client: rappresentato dalla classe java.net.Socket. Crea un oggetto Socket, invia una richiesta di connessione al server, il server risponde alla richiesta e i due stabiliscono una connessione e avviano la comunicazione.
  2. Server: rappresentato dalla classe java.net.ServerSocket. Creare un oggetto ServerSocket equivale ad avviare un servizio e attendere la connessione del client.

Classe presa

Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
Metodo di costruzione:
public Socket(String host, int port) :Crea un oggetto socket e lo connette al numero di porta specificato sull'host specificato. Se l'host specificato è nullo, equivale a che l'indirizzo specificato sia l'indirizzo di loopback (L'indirizzo di loopback (127.xxx) è l'indirizzo di loopback locale (indirizzo di loopback))。
Metodi dei membri:

  • public InputStream getInputStream() : Restituisce il flusso di input per questo socket.
  • public OutputStream getOutputStream() : Restituisce il flusso di output per questo socket.
  • public void close() : Chiudi questa presa.
  • public void shutdownOutput() : Disabilita il flusso di output per questo socket.

Classe ServerSocket

ServerSocket 类:这个类实现了服务器套接字,该对象等待通过网络的请求。
Metodo di costruzione:
public ServerSocket(int port): utilizzare questo costruttore per associarlo a un puntatore durante la creazione di un oggetto ServerSocket.
Su un determinato numero di porta, il parametro port è il numero di porta.
Metodi dei membri:
public Socket accept() : ascolta e accetta connessioni e restituisce un nuovo oggetto Socket per la comunicazione con il client.questo metodo
Si bloccherà finché non verrà stabilita la connessione.

Semplice programma di rete TCP

Analisi della comunicazione TCP:

  1. [Server] Avvia, crea l'oggetto ServerSocket e attendi la connessione.
  2. [Client] Avvia, crea l'oggetto Socket e richiede la connessione.
  3. [Server] riceve la connessione, chiama il metodo accetta e restituisce un oggetto Socket.
  4. [Client] Oggetto socket, ottiene OutputStream e scrive i dati sul server.
  5. [Server] Oggetto socket, ottiene InputStream e legge i dati inviati dal client.
  6. [Server] Oggetto socket, ottiene OutputStream e riscrive i dati sul client.
  7. [Client] Oggetto Scoket, ottiene InputStream, analizza e riscrive i dati.
  8. [Client] Rilascia le risorse e disconnetti.

Esempio di codice:

  • Terminale di servizio:
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

Il server specifica il numero di porta, ottiene l'oggetto Socket tramite il metodo accetta(), ottiene il flusso di input tramite l'oggetto client e infine legge i dati e attende il messaggio inviato dal client.

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

Quando viene creato il client, specificare l'indirizzo IP e il numero di porta della connessione per facilitare la connessione al server, ottenere il flusso di output e i dati di output tramite l'oggetto Socket del client.
Inserisci qui la descrizione dell'immagine

Caricamento file [esteso]

  1. [Client] Flusso di input, legge i dati del file dal disco rigido nel programma.
  2. [Client] Flusso di output, scrive i dati del file sul server.
  3. [Server] Flusso di input, legge i dati del file sul programma server.
  4. [Server] Flusso di output, scrive i dati del file sul disco rigido del server.
  5. [Server] Ottieni il flusso di output e riscrivi i dati.
  6. [Client] Ottieni il flusso di input, analizza e riscrivi i dati.

数据准备:Inserisci un file denominato test.jpg nell'unità D e crea una cartella di test

Esempio di codice:

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

Qui creiamo prima un oggetto server, utilizziamo while(true) per garantire una connessione continua al server, quindi avviamo un thread per garantire che quando un utente carica un file di grandi dimensioni, l'efficienza del caricamento dei file da parte di altri utenti non verrà influenzata. Utilizzare il sistema millisecondi + '.jpg' per impostare il nome del file per garantire che il nome del file non venga sovrascritto a causa dello stesso nome del file durante il caricamento.

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

Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Qui possiamo vedere che il nostro server ha salvato con successo il file inviato dall'utente sul disco rigido.

Gli amanti di Java sono invitati a conoscere l'articolo. L'autore continuerà ad aggiornarlo e attende con ansia la vostra attenzione e raccolta. . .