Berbagi teknologi

Poin Pengetahuan Utama Tingkat Lanjut Java-23-Pemrograman Jaringan

2024-07-12

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

Pengantar pemrograman jaringan

struktur perangkat lunak

  • Struktur C/S: Nama lengkapnya adalah struktur Klien/Server, yang mengacu pada struktur klien dan server.
  • Struktur B/S: Nama lengkapnya adalah struktur Browser/Server, yang mengacu pada struktur browser dan server.

Protokol komunikasi jaringan

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

  • Protokol TCP/IP: Protokol Kontrol Transmisi/Protokol Internet (Protokol Kontrol Transmisi/Protokol Internet), adalah
    Protokol Internet yang paling dasar dan tersebar luas.
    Masukkan deskripsi gambar di sini

Klasifikasi protokol

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

  1. TCP: Protokol Kontrol Transmisi. Protokol TCP adalah protokol komunikasi berorientasi koneksi, yaitu, sebelum transmisi data, koneksi logis dibuat antara ujung pengirim dan ujung penerima, dan kemudian data ditransmisikan. Protokol ini menyediakan transmisi data yang andal dan bebas kesalahan antara keduanya komputer.
  2. UDP: Protokol Datagram Pengguna. Protokol UDP adalah protokol tanpa koneksi. Saat mentransmisikan data, tidak perlu membuat koneksi. Terlepas dari apakah layanan pihak lain dimulai, data, sumber data, dan tujuan langsung dikemas dalam paket data dan dikirim secara langsung. Ukuran setiap paket dibatasi hingga 64k. Ini adalah protokol yang tidak dapat diandalkan karena tidak ada koneksi, sehingga kecepatan transmisinya cepat, tetapi data mudah hilang.

Jabat tangan tiga arah di TCP: Dalam protokol TCP, pada tahap persiapan pengiriman data, terdapat tiga interaksi antara klien dan server untuk menjamin keandalan koneksi.

  • Pada jabat tangan pertama, klien mengirimkan permintaan koneksi ke server dan menunggu konfirmasi oleh server.
  • Pada jabat tangan kedua, server mengirimkan respons kembali ke klien, memberitahukan klien bahwa permintaan koneksi telah diterima.
  • Pada jabat tangan ketiga, klien mengirimkan informasi konfirmasi lagi ke server untuk mengonfirmasi koneksi.

Tiga elemen pemrograman jaringan

  1. Protokol: Aturan yang harus dipatuhi oleh komunikasi jaringan komputer
  2. Alamat IP: mengacu pada Alamat Protokol Internet, umumnya dikenal sebagai IP. Alamat IP digunakan untuk memberi nomor unik pada perangkat komputer di jaringan.
  • IPv4: Merupakan bilangan biner 32-bit, biasanya dibagi menjadi 4 byte, dinyatakan dalam bentuk abcd, seperti 192.168.65.100. Diantaranya, a, b, c, dan d semuanya merupakan bilangan bulat desimal antara 0 dan 255, sehingga dapat diwakili hingga 4,2 miliar.
  • Menggunakan panjang alamat 128-bit, setiap kelompok 16 byte dibagi menjadi 8 kelompok angka heksadesimal, dinyatakan sebagai ABCD:EF01:2345:6789:ABCD:EF01:2345:6789, yang memecahkan masalah sumber daya alamat jaringan yang tidak mencukupi. .
    Perintah yang umum digunakan:
  • ipconfig [Lihat alamat IP lokal]
    Masukkan deskripsi gambar di sini
  • Ping alamat IP spasi [periksa apakah jaringan terhubung]
  1. Nomor port
  • Bilangan bulat diwakili oleh dua byte, rentang nilainya adalah 0 ~ 65535.Diantaranya, nomor port antara 0 dan 1023 digunakan oleh beberapa jaringan terkenal
    Layanan jaringan dan aplikasi, aplikasi biasa perlu menggunakan nomor port di atas 1024. Jika nomor port ditempati oleh layanan atau aplikasi lain, program saat ini akan gagal dijalankan.
    Identifikasi proses dalam jaringan: 协议 + IP地址 + 端口号

Program komunikasi TCP

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

Langkah-langkah komunikasi

  • Program server harus dimulai terlebih dahulu dan menunggu koneksi klien.
  • Klien secara aktif terhubung ke server dan hanya dapat berkomunikasi jika koneksi berhasil. Server tidak dapat terhubung secara aktif ke klien.

Di Java, dua kelas disediakan untuk mengimplementasikan program komunikasi TCP:

  1. Klien: Diwakili oleh kelas java.net.Socket. Buat objek Socket, kirim permintaan koneksi ke server, server merespons permintaan tersebut, dan keduanya membuat koneksi dan memulai komunikasi.
  2. Server: diwakili oleh kelas java.net.ServerSocket. Membuat objek ServerSocket sama dengan memulai layanan dan menunggu klien terhubung.

Kelas soket

Socket 类:该类实现客户端套接字,套接字指的是两台设备之间通讯的端点。
Metode konstruksi:
public Socket(String host, int port) :Membuat objek soket dan menghubungkannya ke nomor port yang ditentukan pada host yang ditentukan. Jika host yang ditentukan adalah null, maka alamat tersebut setara dengan alamat loopback (Alamat loopback (127.xxx) adalah alamat loopback lokal (Alamat Loopback))。
Metode anggota:

  • public InputStream getInputStream() : Mengembalikan aliran input untuk soket ini.
  • public OutputStream getOutputStream() : Mengembalikan aliran keluaran untuk soket ini.
  • public void close() : Tutup soket ini.
  • public void shutdownOutput() : Menonaktifkan aliran keluaran untuk soket ini.

kelas ServerSocket

ServerSocket 类:这个类实现了服务器套接字,该对象等待通过网络的请求。
Metode konstruksi:
Public ServerSocket (int port): Gunakan konstruktor ini untuk mengikatnya ke pointer saat membuat objek ServerSocket.
Pada nomor port tertentu, parameter portnya adalah nomor port.
Metode anggota:
public Socket accept() : Dengarkan dan terima koneksi, dan kembalikan objek Socket baru untuk komunikasi dengan klien.metode ini
Akan memblokir hingga koneksi dibuat.

Program jaringan TCP sederhana

Analisis komunikasi TCP:

  1. [Server] Mulai, buat objek ServerSocket, dan tunggu koneksi.
  2. [Klien] Mulai, buat objek Socket, dan minta koneksi.
  3. [Server] menerima koneksi, memanggil metode penerimaan, dan mengembalikan objek Socket.
  4. [Klien] Objek soket, memperoleh OutputStream, dan menulis data ke server.
  5. [Server] Objek soket, memperoleh InputStream, dan membaca data yang dikirim oleh klien.
  6. [Server] Objek soket, memperoleh OutputStream, dan menulis data kembali ke klien.
  7. Objek [Klien] Scoket, memperoleh InputStream, mem-parsing dan menulis kembali data.
  8. [Klien] Lepaskan sumber daya dan putuskan sambungan.

Contoh kode:

  • Terminal Layanan:
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

Server menentukan nomor port, memperoleh objek Socket melalui metode terima(), memperoleh aliran input melalui objek klien, dan terakhir membaca data dan menunggu pesan yang dikirim oleh klien.

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

Ketika klien dibuat, tentukan alamat IP dan nomor port koneksi untuk memfasilitasi koneksi ke server, dapatkan aliran output dan data output melalui objek Socket klien.
Masukkan deskripsi gambar di sini

Unggah file [Diperpanjang]

  1. [Klien] Masukkan aliran, baca data file dari hard disk ke dalam program.
  2. [Klien] Aliran keluaran, tulis data file ke server.
  3. [Server] Masukkan aliran, baca data file ke program server.
  4. [Server] Aliran keluaran, tulis data file ke hard disk server.
  5. [Server] Dapatkan aliran keluaran dan tulis kembali datanya.
  6. [Klien] Dapatkan aliran masukan dan parsing serta tulis kembali datanya.

数据准备:Tempatkan file bernama test.jpg di bawah drive D dan buat folder tes

Contoh kode:

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

Di sini pertama-tama kita membuat objek server, menggunakan while(true) untuk memastikan koneksi berkelanjutan ke server, dan kemudian memulai thread untuk memastikan bahwa ketika pengguna mengunggah file besar, efisiensi pengguna lain yang mengunggah file tidak akan terpengaruh. Gunakan sistem milidetik + '.jpg' untuk mengatur nama file untuk memastikan bahwa nama file tidak akan ditimpa karena nama file yang sama saat diunggah.

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

Masukkan deskripsi gambar di sini
Masukkan deskripsi gambar di sini
Di sini kita dapat melihat bahwa server kami berhasil menyimpan file yang dikirim oleh pengguna ke hard disk.

Para pecinta Java dipersilakan untuk mempelajari artikel tersebut. Penulis akan terus mengupdatenya dan menantikan perhatian dan koleksinya. . .