Java學習-第一部分-第三階段-第一節:網路編程

来源:https://www.cnblogs.com/wenjie2000/archive/2022/09/08/16670708.html
-Advertisement-
Play Games

網路編程 筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 網路基礎 網路通信 概念:兩台設備之間通過網路實現數據傳輸 網路通信:將數據通過網路從一臺設備傳輸到另一臺設備 java.net包下提供了一系列的類或介面,供程式員使用,完成 ...


網路編程

筆記目錄:(https://www.cnblogs.com/wenjie2000/p/16378441.html)

網路基礎

網路通信

  1. 概念:兩台設備之間通過網路實現數據傳輸
  2. 網路通信:將數據通過網路從一臺設備傳輸到另一臺設備
  3. java.net包下提供了一系列的類或介面,供程式員使用,完成網路通信

網路

  1. 概念:兩台或多台設備通過一定物理設備連接起來構成了網路

  2. 根據網路的覆蓋範圍不同,對網路進行分類:

    區域網:覆蓋範圍最小,僅僅覆蓋一個教室或一個機房
    城域網:覆蓋範圍較大,可以覆蓋一個城市
    廣域網:覆蓋範圍最大,可以覆蓋全國,甚至全球,萬維網是廣域網的代表

ip地址

  1. 概念:用於唯一標識網路中的每台電腦

  2. 查看ip地址: ipconfig

  3. ip地址的表示形式:點分十進位XX.XX.XX.XX

  4. 每一個十進位數的範圍:0~255

  5. ip地址的組成=網路地址+主機地址,比如:192.168.16.69

  6. IPv6是互聯網工程任務組設計的用於替代IPv4的下一代IP協議,其地址數量號稱可以為全世界的每一粒沙子編上一個地址[1]。

  7. 由於IPv4最大的問題在於網路地址資源有限,嚴重製約了互聯網的應用和發展。IPv6的使用,不僅能解決網路地址資源數量的問題,而且也解決了多種接入設備連入互聯的障礙

ipv4地址分類

image

image

功能變數名稱

  1. www.baidu.com
  2. 好處:為了方便記憶,解決記ip的困難
  3. 概念:將ip地址映射成功能變數名稱(這裡怎麼映射上,HTTP協議)

埠號

  1. 概念:用於標識電腦上某個特定的網路程式

  2. 表示形式:以整數形式,範圍0~65535【0--216

  3. 0~1024已經被占用,比如ssh 22, ftp 21, smtp 25 http 80(在網路開發中,不要使用0-1024的埠名花有主.)

  4. 常見的網路程式埠號:
    tomcat :8080
    mysql:3306

    oracle:1521

    salserver:1433

網路通訊協議

網路通信協議(tcp/ip)

TCP/IP (Transmission ControlProtocol/Internet Protocol)的簡寫.中文譯名為傳輸控制協議/網際網路互聯協議,又叫網路通訊協議,這個協議是lnternet最基本的協議、Internet國際互聯網路的基礎,簡單地說,就是由網路層的IP協議和傳輸層的TCP協議組成的。[示意圖]

image

網路通訊協議

image

TCP和UDP

TCP協議:傳輸控制協議

  1. 使用TCP協議前,須先建立TCP連接,形成傳輸數據通道
  2. 傳輸前,採用"三次握手"方式,是可靠的
  3. TCP協議進行通信的兩個應用進程:客戶端、服務端
  4. 在連接中可進行大數據量的傳輸
  5. 傳輸完畢,需釋放已建立的連接,效率低
  6. 舉例:打電話

UDP協議:用戶數據協議

  1. 將數據、源、目的封裝成數據包,不需要建立連接
  2. 每個數據報的大小限制在64K內,不適合傳輸大量數據
  3. 因無需連接,故是不可靠的
  4. 發送數據結束時無需釋放資源(因為不是面向連接的),速度快
  5. 舉例:廁所通知,發簡訊,QQ給某人發消息 (直接發信息,不管是否能收到)

InetAddress

  1. 獲取本機InetAddress對象getLocalHost
  2. 根據指定主機名/功能變數名稱獲取ip地址對象getByName
  3. 獲取lnetAddress對象的主機名getHostName
  4. 獲取InetAddress對象的地址getHostAddress
public static void main(String[] args) throws UnknownHostException {
    InetAddress localHost = InetAddress.getLocalHost();
    System.out.println(localHost);//DESKTOP-VUTHVJ2/192.168.1.173

    //2.根據指定主機名或ip獲取InetAddress對象
    InetAddress host1 = InetAddress.getByName("DESKTOP-VUTHVJ2");
    System.out.println("host1=" + host1); //DESKTOP-VUTHVJ2/192.168.1.173

    //3.根據功能變數名稱返回InetAddress對象,比如 www.baidu.com對應
    InetAddress host2 = InetAddress.getByName("www.baidu.com");
    System.out.println(host2);//www.baidu.com/39.156.66.14

    //4,通過InetAddress對象,獲取對應的地址
    String hostAddress = host2.getHostAddress();
    System.out.println(hostAddress);//39.156.66.14

    //5.通過InetAddress對象,獲取對應的主機名/或者的功能變數名稱
    String hostName = host2.getHostName();
    System.out.println(hostName);//www.baidu.com
}

Socket

基本介紹

  1. 套接字(Socket)開髮網絡應用程式被廣泛採用,以至於成為事實上的標準。
  2. 通信的兩端都要有Socket,是兩台機器間通信的端點
  3. 網路通信其實就是Socket|間的通信。
  4. Socket允許程式把網路連接當成一個流,數據在兩個Socket間通過IO傳輸。
  5. 一般主動發起通信的應用程式屬客戶端,等待通信請求的為服務端

示意圖

image

TCP網路通信編程

基本介紹

  1. 基於客戶端服務端的網路通信
  2. 底層使用的是TCP/IP協議
  3. 應用場景舉例:客戶端發送數據,服務端接受並顯示控制台
  4. 基於Socket的TCP編程

image

應用案例1(使用位元組流)

  1. 編寫一個伺服器端,和一個客戶端

  2. 伺服器端在9999埠監聽

  3. 客戶端連接到伺服器端,,發送"hello, server",然後退出

  4. 伺服器端接收到客戶端發送的信息,輸出,並退出

    image

    伺服器代碼

    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class SocketTCP01Server {
        public static void main(String[] args) throws IOException {
            //思路
            //1.在本機的9999埠監聽,等待連接
            //細節:要求在本機沒有其它服務在監聽9999
            ServerSocket serverSocket = new ServerSocket(9999);
            System.out.println("服務端,在9999埠監聽,等待連接..");
            //2.當沒有客戶端連接9999埠時,程式會阻塞,等待連接
            //如果有客戶端連接,則會返回Socket對象,程式繼續
            //細節:這個ServerSocket可以通過accept()返回多個Socket[多個客戶端連接伺服器的併發]
            Socket socket = serverSocket.accept();
            System.out.println("伺服器端socket ="+socket.getClass());
            //
            //3.通過socket.getInputStream()讀取
            InputStream inputStream = socket.getInputStream();
            //4.IO讀取
            byte[] bytes = new byte[8];
            int readLen=0;
            while ((readLen=inputStream.read(bytes))!=-1){
                System.out.print(new String(bytes,0,readLen));
            }
            //5.關閉流和socket
            inputStream.close();
            socket.close();
            serverSocket.close();
            //客戶端寫入到數據通道的數據,顯示
        }
    }
    

    客戶端代碼

    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    
    public class SocketTCP01Client {
        public static void main(String[] args) throws IOException {
            //思路
            //1。連接服務端(ip,埠)
            //解讀:連接本機的9999埠,如果連接成功,返回Socket對象
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            System.out.println("客戶端socket返回=" + socket.getClass());
            //2.連接上後,生成Socket,通過socket.getOutputStream()
            //得到和socket對象關聯的輸出流對象
            OutputStream outputStream = socket.getOutputStream();
            //3.通過輸出流,寫入數據到數據通道
            outputStream.write("hello,world".getBytes());
            //關閉流對象
            outputStream.close();
            socket.close();
            System.out.println("客戶端退出");
        }
    }
    

應用案例2(使用位元組流)

  1. 編寫一個服務囂端,和一個客戶端

  2. 伺服器端在9999埠監聽

  3. 客戶端連接到伺服器端,發送"hello, server",並接收伺服器端回發的"hello,client",再退出

  4. 伺服器端接收到客戶端發送的信息,輸出,併發送"hello, client",再退出

    示意圖

    image

    伺服器代碼

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class SocketTCP01Server {
        public static void main(String[] args) throws IOException {
            //思路
            //1.在本機的9999埠監聽,等待連接
            //細節:要求在本機沒有其它服務在監聽9999
            ServerSocket serverSocket = new ServerSocket(9999);
            System.out.println("服務端,在9999埠監聽,等待連接..");
            //2.當沒有客戶端連接9999埠時,程式會阻塞,等待連接
            //如果有客戶端連接,則會返回Socket對象,程式繼續
            //細節:這個ServerSocket可以通過accept()返回多個Socket[多個客戶端連接伺服器的併發]
            Socket socket = serverSocket.accept();
            System.out.println("伺服器端socket ="+socket.getClass());
            //
            //3.通過socket.getInputStream()讀取
            InputStream inputStream = socket.getInputStream();
            //4.IO讀取
            byte[] bytes = new byte[8];
            int readLen=0;
            while ((readLen=inputStream.read(bytes))!=-1){
                System.out.print(new String(bytes,0,readLen));
            }
            
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write("hello, client".getBytes());
            //設置結束標記
            socket.shutdownOutput();
    
            //5.關閉流和socket
            inputStream.close();
            outputStream.close();
            socket.close();
            serverSocket.close();
            //客戶端寫入到數據通道的數據,顯示
        }
    }
    

    客戶端代碼

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.Socket;
    
    public class SocketTCP01Client {
        public static void main(String[] args) throws IOException {
            //思路
            //1。連接服務端(ip,埠)
            //解讀:連接本機的9999埠,如果連接成功,返回Socket對象
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            System.out.println("客戶端socket返回=" + socket.getClass());
            //2.連接上後,生成Socket,通過socket.getOutputStream()
            //得到和socket對象關聯的輸出流對象
            OutputStream outputStream = socket.getOutputStream();
            //3.通過輸出流,寫入數據到數據通道
            outputStream.write("hello,server".getBytes());
            //設置結束標記
            socket.shutdownOutput();
    
            InputStream inputStream = socket.getInputStream();
            int readLen=0;
            byte[] bytes = new byte[8];
            while ((readLen=inputStream.read(bytes))!=-1){
                System.out.print(new String(bytes,0,readLen));
            }
            //關閉流對象
            inputStream.close();
            outputStream.close();
            socket.close();
            System.out.println("客戶端退出");
    
        }
    }
    

應用案例3(使用字元流)

  1. 編寫一個服務端,和一個客戶端

  2. 服務端在9999埠監聽

  3. 客戶端連接到服務端,發送"hello, server",並接收服務端回發的"hello,client",再退出

  4. 服務端接收到客戶端發送的信息,輸出,併發送"hello, client",再退出

    示意圖

    image

    伺服器端代碼

    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class SocketTCP01Server {
        public static void main(String[] args) throws IOException {
            //思路
            //1.在本機的9999埠監聽,等待連接
            //細節:要求在本機沒有其它服務在監聽9999
            ServerSocket serverSocket = new ServerSocket(9999);
            System.out.println("服務端,在9999埠監聽,等待連接..");
            //2.當沒有客戶端連接9999埠時,程式會阻塞,等待連接
            //如果有客戶端連接,則會返回Socket對象,程式繼續
            //細節:這個ServerSocket可以通過accept()返回多個Socket[多個客戶端連接伺服器的併發]
            Socket socket = serverSocket.accept();
            System.out.println("伺服器端socket ="+socket.getClass());
            //
            //3.通過socket.getInputStream()讀取
            InputStream inputStream = socket.getInputStream();
            //4.IO讀取,使用字元流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String s = bufferedReader.readLine();
            System.out.println(s);
    
            //獲取socket關聯的輸出流
            OutputStream outputStream = socket.getOutputStream();
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            bufferedWriter.write("hello, client 字元流");
            bufferedWriter.newLine();//表示恢復內容結束
            bufferedWriter.flush();
    
    
            //5.關閉流和socket
            bufferedReader.close();
            bufferedWriter.close();
            socket.close();
            serverSocket.close();
            //客戶端寫入到數據通道的數據,顯示
        }
    }
    

    客戶端代碼

    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    
    public class SocketTCP01Client {
        public static void main(String[] args) throws IOException {
            //思路
            //1。連接服務端(ip,埠)
            //解讀:連接本機的9999埠,如果連接成功,返回Socket對象
            Socket socket = new Socket(InetAddress.getLocalHost(), 9999);
            System.out.println("客戶端socket返回=" + socket.getClass());
            //2.連接上後,生成Socket,通過socket.getOutputStream()
            //得到和socket對象關聯的輸出流對象
            OutputStream outputStream = socket.getOutputStream();
            //3.通過輸出流,寫入數據到數據通道,使用字元流
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            bufferedWriter.write("hello,server 字元流");
            bufferedWriter.newLine();//插入一個換行符,表示寫入的內容結束,註意,要求對方使用readLine()!!否者讀不到結束
            bufferedWriter.flush();//如果使用的字元流,需要手動刷新,否則數據不會寫入數據通道
    
            //4。獲取和socket關聯的輸入流。讀取數據(字元),並顯示
            InputStream inputStream = socket.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String s = bufferedReader.readLine();
            System.out.println(s);
    
            //關閉流對象
            bufferedReader.close();//關閉外層流
            bufferedWriter.close();
            socket.close();
            System.out.println("客戶端退出");
    
        }
    }
    

應用案例4

  1. 編寫一個服務端,和一個客戶端

  2. 伺服器端在8888埠監聽

  3. 客戶端連接到服務端,發送一張圖片d:\qie.png

  4. 伺服器端接收到客戶端發送的圖片,保存到src下,發送"收到圖片”再退出

  5. 客戶端接收到服務端發送的“收到圖片”,再退出

    伺服器端代碼

    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class SocketTCP01Server {
        public static void main(String[] args) throws IOException {
    
            ServerSocket serverSocket = new ServerSocket(8888);
            System.out.println("服務端,在8888埠監聽,等待連接..");
            Socket socket = serverSocket.accept();
            System.out.println("伺服器端socket =" + socket.getClass());
            InputStream inputStream = socket.getInputStream();
    
            FileOutputStream fileOutputStream = new FileOutputStream("src\\(1).png");
            byte[] bytes = new byte[1024];
            int readLen;
            while ((readLen = inputStream.read(bytes)) != -1) {
                 fileOutputStream.write(bytes,0,readLen);
            }
            System.out.println("收到");
    
            OutputStream outputStream = socket.getOutputStream();
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
            outputStreamWriter.write("收到圖片");
            outputStreamWriter.flush();
            socket.shutdownOutput();
    
            outputStreamWriter.close();
            fileOutputStream.close();
            inputStream.close();
            socket.close();
            serverSocket.close();
    
            System.out.println("伺服器端結束");
        }
    }
    

    客戶端代碼

    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    //代碼還可以繼續優化
    public class SocketTCP01Client {
        public static void main(String[] args) throws IOException {
            Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
            System.out.println("客戶端socket返回=" + socket.getClass());
    
            FileInputStream fileInputStream = new FileInputStream("D:\\(1).png");
            byte[] bytes = new byte[1024];
            int len;
            OutputStream outputStream = socket.getOutputStream();
            while ((len = fileInputStream.read(bytes)) != -1) {
                outputStream.write(bytes,0,len);
            }
            socket.shutdownOutput();
    
            InputStream inputStream = socket.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            System.out.println(bufferedReader.readLine());
    
            bufferedReader.close();
            outputStream.close();
            fileInputStream.close();
            socket.close();
    
            System.out.println("客戶端退出");
        }
    }
    

編程題

  1. 編寫客戶端程式和伺服器端程式

  2. 客戶端可以輸入一個音樂文件名,比如高山流水,服務端收到音樂名後,可以給客戶端返回這個音樂文件,如果伺服器沒有這個文件,返回一個預設的音樂即可.

  3. 客戶端收到文件後,保存到本地d:\\

  4. 提示:該程式可以使用StreamUtils.java
    本質:其實就是指定下載文件的應用.結合文件上傳來做。

    伺服器端 代碼

    import java.io.*;
    import java.net.*;
    
    //伺服器端
    public class B {
        public static void main(String[] args) throws IOException {
            ServerSocket serverSocket = new ServerSocket(9000);
            Socket socket = serverSocket.accept();
            InputStream inputStream = socket.getInputStream();
    
            byte[] bytes = new byte[1024];
            int bytesLen;
            String s="";
            while ((bytesLen=inputStream.read(bytes))!=-1){
                s+=new String(bytes,0,bytesLen);
            }
    
            File file = new File("src\\",s);
            System.out.println("文件名:" +file.getPath());
            BufferedInputStream bufferedInputStream;
            if (file.exists()) {
                System.out.println("找到文件");
                bufferedInputStream= new BufferedInputStream(new FileInputStream(file));
            }else {
                System.out.println("未找到該文件");
                bufferedInputStream= new BufferedInputStream(new FileInputStream("src\\22.mp4"));
            }
    
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            while ((bytesLen=bufferedInputStream.read(bytes))!=-1){
                byteArrayOutputStream.write(bytes,0,bytesLen);
            }
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(socket.getOutputStream());
            bytes = byteArrayOutputStream.toByteArray();
            bufferedOutputStream.write(bytes);
            bufferedOutputStream.flush();
            socket.shutdownOutput();
    
            bufferedOutputStream.close();
            bufferedInputStream.close();
            socket.close();
            serverSocket.close();
        }
    }
    

    客戶端 代碼

    import java.io.*;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.util.Scanner;
    
    
    //客戶端
    public class A {
        public static void main(String[] args) throws IOException {
            Socket socket = new Socket(InetAddress.getLocalHost(), 9000);
            OutputStream outputStream = socket.getOutputStream();
    
            System.out.println("請輸入文件名:");
            Scanner scanner = new Scanner(System.in);
            String s = scanner.next();
            outputStream.write(s.getBytes());
            socket.shutdownOutput();
            System.out.println("等待中");
    
            BufferedInputStream bufferedInputStream = new BufferedInputStream(socket.getInputStream());
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] bytes = new byte[1024];
            int bytesLen;
            while ((bytesLen=bufferedInputStream.read(bytes))!=-1){
                byteArrayOutputStream.write(bytes,0,bytesLen);
            }
            BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("d:\\"+s));
            bufferedOutputStream.write(byteArrayOutputStream.toByteArray());
    
            bufferedOutputStream.close();
            byteArrayOutputStream.close();
            bufferedInputStream.close();
            outputStream.close();
            socket.close();
        }
    }
    

netstat 指令

  1. netstat -an可以查看當前主機網路情況,包括埠監聽情況和網路連接情況(netstat -anb 可以看到哪個程式在使用這些埠)

  2. netstat -an | more可以分頁顯示

  3. 要求在dos控制臺下執行

說明:
(1) Listening表示某個埠在監聽
(2)如果有一個外部程式(客戶端)連接到該埠,就會顯示一條連接信息.

(3)可以輸入ctrl +c退出指令

TCP網路通訊不為人知的秘密

  1. 當客戶端連接到服務端後,實際上客戶端也是通過一個埠和服務端進行通訊的,這
    個埠是TCP/IP來分配的,是不確定的。
  2. 程式驗證

UDP編程

基本介紹

  1. 類 DatagramSocket和 DatagramPacket實現了基於UDP協議網路程式。

  2. UDP數據報通過數據報套接字DatagramSocket發送和接收,系統不保證UDP數據報一定能夠安全送到目的地,也不能確定什麼時候可以抵達。

  3. DatagramPacket 對象封裝了UDP數據報,在數據報中包含了發送端的IP地址和埠號以及接收端的IP地址和埠號。

  4. UDP協議中每個數據報都給出了完整的地址信息,因此無須建立發送方和接收方的連接

基本流程

  1. 核心的兩個類/對象DatagramSocket與DatagramPacket
  2. 建立發送端,接收端
  3. 建立數據包
  4. 調用DatagramSocket的發送、接收方法5.關閉DatagramSocket

image

應用案例

  1. 編寫一個接收端A,和一個發送端B
  2. 接收端A在9999埠等待接收數據(receive)
  3. 發送端B向接收端A發送數據"hello,明天吃火鍋~"
  4. 接收端A接收到發送端B發送的數據,回覆"好的,明天見",再退出
  5. 發送端接收回覆的數據,再退出

A埠 代碼

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class A {
    public static void main(String[] args) throws IOException {
        //1。創建一個DatagramSocket對象,準備在9999接收數據
        DatagramSocket socket = new DatagramSocket(9999);
        //2。構建一個DatagramPacket 對象,準備接收數據
        //在前面講解UDP協議時,一個數據包最大64k
        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf, buf.length);
        //3.調用接收方法,將通過網路傳輸的DatagramPacket對象
        // 填充到 packet對象
        //提示:當有數據包發送到本機的9999埠時,就會接收到數據
        // 如果沒有數據包發送到本機的9999埠,就會阻塞等待。
        System.out.println("接收端A等待接收數據..");
        socket.receive(packet);

        //4。可以把packet進行拆包,取出數據,並顯示。
        int length = packet.getLength();//實際接收到的數據位元組長度
        byte[] data = packet.getData();//接收到數據
        String s = new String(data, 0, length);
        System.out.println(s);

        data="好的,明天見".getBytes();
        DatagramPacket packet1 = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.1.173"), 9998);
        socket.send(packet1);

        socket.close();

        System.out.println("A退出");
    }
}

B埠代碼

import java.io.IOException;
import java.net.*;

public class B {
    public static void main(String[] args) throws IOException {
        //1.創建DatagramSocket對象,準備在9998埠接收數據
        DatagramSocket socket = new DatagramSocket(9998);
        //2.將需要發送的數據,封裝到DatagramPacket對象
        byte[] data="hello,明天吃火鍋~".getBytes();
        //說明:封裝的DatagramPacket對象 data 內容位元組數組,data.length ,主機(IP),埠
        DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("192.168.1.173"), 9999);
        socket.send(packet);

        System.out.println("接收端B等待回覆數據..");
        byte[] buf = new byte[1024];
        packet = new DatagramPacket(buf, buf.length);
        socket.receive(packet);

        //4。可以把packet進行拆包,取出數據,並顯示。
        int length = packet.getLength();//實際接收到的數據位元組長度
        data = packet.getData();//接收到數據
        String s = new String(data, 0, length);
        System.out.println(s);

        //關閉資源
        socket.close();
        System.out.println("B退出");

    }
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • JS第七種數據類型Symbol詳解 點擊打開視頻講解更加詳細 一、什麼是Symbol? Symbol是ES6中引入的一種新的基本數據類型,用於表示一個獨一無二的值。它是JavaScript中的第 七種數據類型,與undefined、null、Number(數值)、String(字元串)、Boolea ...
  • 函數:就是封裝了一段可以被重覆執行調用的代碼塊,目的就是讓大量的代碼重覆使用 函數的使用 分兩步:聲明函數和調用函數 函數的封裝 函數的封裝是把一個或者多個功能通過函數的方式封裝起來,對外只提供一個簡單的函數介面 函數的參數 形參和實參 形參和實參個數不匹配問題 ...
  • IM多人聊天室功能簡介 ZIM SDK 提供多人房間聊天功能,支持用戶向房間內發送文本消息或自定義消息,實現了多人線上交流、同步分享。 多人房間聊天功能可應用於小班課或者會議室等場景,房間成員數量上限請參考 計費說明。 IM房間管理功能的前提條件 在實現“房間管理”功能之前,請確保: 已在 ZEGO ...
  • 關健術語 本文用到的一些關鍵詞語以及常用術語,主要如下: 信號量(Semaphore): 是在多線程環境下使用的一種設施,是可以用來保證兩個或多個關鍵代碼段不被併發調用,也是作系統用來解決併發中的互斥和同步問題的一種方法。 信號量機制(Semaphores): 用來解決同步/互斥的問題的,它是196 ...
  • JavaWeb核心篇(1)——HTTP/Tomcat/Servlet 在正式講解JavaWeb前,我們先來瞭解一下JavaWeb: Web:全球廣域網,也被稱為萬維網(www),能夠通過瀏覽器訪問的網站 JavaWeb:通過Java技術來解決相關Web互聯網領域的技術棧 如果說網頁是為了展現數據,數 ...
  • 適配器模式(Adapter Pattern)是作為兩個不相容的介面之間的橋梁。這種類型的設計模式屬於結構型模式,它結合了兩個獨立介面的功能。就像電腦/投影儀那種,電腦要通過接線的方式投影,但是在以前的介面都是VGA介面,然而我們的電腦卻大多都是HDMI類型的,這就需要轉接頭來轉換介面,於是,這個轉接... ...
  • 定義:適配器模式是將一個類的介面轉換成客戶希望的另一個介面,適配器模式使得原本由於介面不相容而不能一起工作的類可以一起工作,在軟體設計中我們需要將一些“現存的對象”放到新的環境中,而新環境要求的介面是現對象所不能滿足的,我們可以使用這種模式進行介面適配轉換,使得“老對象”符合新環境的要求。 使用場景 ...
  • 作者有過一點Python基礎,但沒有系統地學習過python。此博客為作者的《Python編程——從入門到精通》自學筆記。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...