Java基礎語法練習45(網絡編程)

目錄

一、網絡的相關概念

1.網絡通信

?2.網絡

3.ip 地址?

?4.ipv4 地址分類

5.域名

6.網絡通信協議

7.TCP 和 UDP?

二、InetAddress類?

1.相關方法

2.代碼示例如下:

三、Socket

1.基本介紹

四、TCP 網絡通信編程

1.基本介紹

?2.應用示例:

2.1題目一(字節流)要求如下:

2.1.1服務端代碼如下:

?2.1.2客戶端代碼如下:

2.2題目二(字節流)要求如下:

?2.2.1服務端代碼如下:

2.2.2客戶端代碼如下:

2.3題目三?(字符流)要求如下:

2.3.1服務端代碼如下:

2.3.2客戶端代碼如下:

2.4題目四(網絡上傳文件-字節流)要求如下:

2.4.1工具包StreamUtils代碼如下:

2.4.2服務端代碼如下:

2.4.3客戶端代碼如下:

五、UDP 網絡通信編程[了解]

1.基本介紹

2. 基本流程

3.應用案例

3.1要求如下:

3.2接受端代碼如下:

3.3發送端代碼如下:


一、網絡的相關概念

1.網絡通信

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

?2.網絡

  1. 概念:兩臺或多臺設備通過一定物理設備連接起來構成了網絡
  2. 根據網絡的覆蓋范圍不同,對網絡進行分類:
    • 局域網:覆蓋范圍最小,僅僅覆蓋一個教室或一個機房
    • 城域網:覆蓋范圍較大,可以覆蓋一個城市
    • 廣域網:覆蓋范圍最大,可以覆蓋全國,甚至全球,萬維網是廣域網的代

3.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 的使用,不僅能解決網絡地址資源數量的問題,而且也解決了多種接入設備連入互聯網的障礙

?4.ipv4 地址分類

? ? ? ? ? IPv4 地址是 32 位二進制數,通常以點分十進制表示(如 192.168.1.1)。傳統分類基于第一個八位組的前綴,分為A、B、C、D、E 五類,其中 A、B、C 類為常用單播地址,D 類為組播,E 類保留。以下是詳細分類:

5.域名

  1. www.baidu.com
  2. 好處:為了方便記憶,解決記 ip 的困難
  3. 概念:將 ip 地址映射成域名,這里怎么映射上,HTTP 協議

?端口號

  1. 概念:用于標識計算機上某個特定的網絡程序
  2. 表示形式:以整數形式,端口范圍 0~65535 [2 個字節表示端口 0~2^16-1]
  3. 0~1024 已經被占用,比如 ssh 22,ftp 21,smtp 25,http 80
  4. 常見的網絡程序端口號:
    ? tomcat :8080
    ? mysql:3306
    ? oracle:1521
    ? sqlserver:1433

6.網絡通信協議

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

7.TCP 和 UDP?

  • TCP 協議:傳輸控制協議
    1. 使用 TCP 協議前,須先建立 TCP 連接,形成傳輸數據通道
    2. 傳輸前,采用 “三次握手” 方式,是可靠的
    3. TCP 協議進行通信的兩個應用進程:客戶端、服務端
    4. 在連接中可進行大數據量的傳輸
    5. 傳輸完畢,需釋放已建立的連接,效率低
  • UDP 協議:用戶數據協議
    1. 將數據、源、目的封裝成數據包,不需要建立連接
    2. 每個數據報的大小限制在 64K 內,不適合傳輸大量數據
    3. 因無需連接,故是不可靠的
    4. 發送數據結束時無需釋放資源 (因為不是面向連接的),速度快
    5. 舉例:廁所通知;發短信

二、InetAddress類?

1.相關方法

  1. 獲取本機 InetAddress 對象 getLocalHost
  2. 根據指定主機名 / 域名獲取 ip 地址對象 getByName
  3. 獲取 InetAddress 對象的主機名 getHostName
  4. 獲取 InetAddress 對象的地址 getHostAddress

2.代碼示例如下:


import java.net.InetAddress;
import java.net.UnknownHostException;public class API001 {public static void main(String[] args) throws UnknownHostException {//1.獲取本機InetAddress對象getLocalHostInetAddress localHost=InetAddress.getLocalHost(); //LAPTOP-BC9N4EFF/113.54.254.61System.out.println(localHost);//2.根據指定主機名/域名獲取ip地址對象getByNameInetAddress host2=InetAddress.getByName("LAPTOP-BC9N4EFF");System.out.println(host2);//3.根據域名返回InetAddress對象,比如:"www.baidu.com"InetAddress host3=InetAddress.getByName("www.baidu.com");System.out.println(host3);//4.通過InetAddress對象,獲取對應的地址String hostAddress=host3.getHostAddress();//IPSystem.out.println(hostAddress);//5.通過InetAddress對象,獲取對應的主機名/或者的域名String host3Name=host3.getHostName();System.out.println(host3Name);}
}

三、Socket

1.基本介紹

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

四、TCP 網絡通信編程

1.基本介紹

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

?

?2.應用示例:

2.1題目一(字節流)要求如下:

  1. 編寫一個服務器端,和一個客戶端
  2. 服務器端在 9999 端口監聽
  3. 客戶端連接到服務器端,發送 "hello, server",然后退出
  4. 服務器端接收到 客戶端發送的 信息,輸出,并退出

創建2個Java文件,并先運行服務端代碼(運行后不要關閉),在運行客戶端代碼。(如果條件允許,最好在兩臺電腦進行)。

2.1.1服務端代碼如下:

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class SocketTCP01Server01 {public static void main(String[] args) throws IOException {//思路//1.在本機的9999端口監聽,等待連接//細節:要求在本機沒有其它服務在監聽9999//細節:這個ServerSocket可以通過accept()返回多個Socket[多個客戶端連接服務器的并發]ServerSocket serverSocket=new ServerSocket(9999);System.out.println("服務端,在 9999 端口監聽,等待連接..");//2. 當沒有客戶端連接9999端口時,程序會 阻塞, 等待連接// 如果有客戶端連接,則會返回Socket對象,程序繼續Socket socket = serverSocket.accept();System.out.println("服務端 socket =" + socket.getClass());//3. 通過socket.getInputStream() 讀取客戶端寫入到數據通道的數據, 顯示InputStream inputStream = socket.getInputStream();//4. IO 讀取byte[] buf = new byte[1024];int readLen = 0;while ((readLen = inputStream.read(buf)) !=-1) {System.out.println(new String(buf, 0, readLen));//根據讀取到的實際長度,顯示內容.}//5.關閉流和socketinputStream.close();socket.close();serverSocket.close();//關閉}
}
?2.1.2客戶端代碼如下:
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;//客戶端,發送 "hello,server" 給服務端
public class SocketTCP01Client01 {public static void main(String[] args) throws IOException {//思路//1. 連接服務端 (ip, 端口)//解讀: 連接本機的 9999端口, 如果連接成功,返回Socket對象Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//這里使用的是本機,如果是遠程服務器改為對應的IP或域名System.out.println("客戶端 socket 返回=" + socket.getClass());//2. 連接上后,生成Socket, 通過socket.getOutputStream()//得到 和 socket對象關聯的輸出流對象OutputStream outputStream = socket.getOutputStream();//3. 通過輸出流,寫入數據到 數據通道outputStream.write("hello, server".getBytes());//4. 關閉流對象和socket, 必須關閉outputStream.close();socket.close();System.out.println("客戶端退出.....");}
}

2.2題目二(字節流)要求如下:

  1. 編寫一個服務端,和一個客戶端
  2. 服務器端在 9999 端口監聽
  3. 客戶端連接到服務端,發送 "hello, server", 并接收服務器端回發的 "hello,client", 再退出
  4. 服務器端接收到客戶端發送的信息,輸出,并發送 "hello, client", 再退出

創建2個Java文件,并先運行服務端代碼(運行后不要關閉),在運行客戶端代碼。(如果條件允許,最好在兩臺電腦進行)。

注意:相比于上個案例,需要設置結束標記,就類似于對講機中的完畢,告訴別人我說完了?

?2.2.1服務端代碼如下:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class SocketTCP01Server02 {public static void main(String[] args) throws IOException {//1.在本機的9999端口監聽,等待連接//細節:要求在本機沒有其它服務在監聽9999//細節:這個ServerSocket可以通過accept()返回多個Socket[多個客戶端連接服務器的并發]ServerSocket serverSocket=new ServerSocket(9999);System.out.println("服務端,在 9999 端口監聽,等待連接..");//2. 當沒有客戶端連接9999端口時,程序會 阻塞, 等待連接// 如果有客戶端連接,則會返回Socket對象,程序繼續Socket socket = serverSocket.accept();System.out.println("服務端 socket =" + socket.getClass());//3. 通過socket.getInputStream() 讀取客戶端寫入到數據通道的數據, 顯示InputStream inputStream = socket.getInputStream();//4. IO 讀取byte[] buf = new byte[1024];int readLen = 0;while ((readLen = inputStream.read(buf)) !=-1) {System.out.println(new String(buf, 0, readLen));//根據讀取到的實際長度,顯示內容.}System.out.println("======================源代碼增加處===========================");OutputStream outputStream = socket.getOutputStream();//5. 通過輸出流,寫入數據到 數據通道outputStream.write("hello, client".getBytes());///設置結束標記socket.shutdownOutput();//5.關閉流和socketoutputStream.close();inputStream.close();socket.close();serverSocket.close();//關閉}
}
2.2.2客戶端代碼如下:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;public class SocketTCP01Client02 {public static void main(String[] args) throws IOException {//1. 連接服務端 (ip, 端口)//解讀: 連接本機的 9999端口, 如果連接成功,返回Socket對象Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//這里使用的是本機,如果是遠程服務器改為對應的IP或域名System.out.println("客戶端 socket 返回=" + socket.getClass());//2. 連接上后,生成Socket, 通過socket.getOutputStream()//得到 和 socket對象關聯的輸出流對象OutputStream outputStream = socket.getOutputStream();//3. 通過輸出流,寫入數據到 數據通道outputStream.write("hello, server".getBytes());System.out.println("======================源代碼增加處===========================");設置結束標記socket.shutdownOutput();InputStream inputStream = socket.getInputStream();//4. IO 讀取byte[] buf = new byte[1024];int readLen = 0;while ((readLen = inputStream.read(buf)) !=-1) {System.out.println(new String(buf, 0, readLen));//根據讀取到的實際長度,顯示內容.}inputStream.close();outputStream.close();socket.close();}
}

2.3題目三?(字符流)要求如下:

  1. 編寫一個服務端,和一個客戶端
  2. 服務端在 9999 端口監聽
  3. 客戶端連接到服務端,發送 "hello, server", 并接收服務端回發的 "hello,client", 再退出
  4. 服務端接收到客戶端發送的信息,輸出,并發送 "hello, client", 再退出

提示:可以直接在上一個案例修改即可?

2.3.1服務端代碼如下:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class SocketTCP01Server03 {public static void main(String[] args) throws IOException {//1.在本機的9999端口監聽,等待連接//細節:要求在本機沒有其它服務在監聽9999//細節:這個ServerSocket可以通過accept()返回多個Socket[多個客戶端連接服務器的并發]ServerSocket serverSocket=new ServerSocket(9999);System.out.println("服務端,在 9999 端口監聽,等待連接..");//2. 當沒有客戶端連接9999端口時,程序會 阻塞, 等待連接// 如果有客戶端連接,則會返回Socket對象,程序繼續Socket socket = serverSocket.accept();System.out.println("服務端 socket =" + socket.getClass());//3. 通過socket.getInputStream() 讀取客戶端寫入到數據通道的數據, 顯示InputStream inputStream = socket.getInputStream();//將字節流轉換成字符流BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String str = bufferedReader.readLine();System.out.println(str);OutputStream outputStream = socket.getOutputStream();//字節流轉換成字符流BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("hello, client 字符流");bufferedWriter.newLine();//插入一個換行符,表示寫入的內容結束, 注意,要求對方使用readLine()!!!!bufferedWriter.flush(); //如果使用的字符流,需要手動刷新,否則數據不會寫入數據通道//5.關閉流和socketbufferedWriter.close();bufferedReader.close();socket.close();serverSocket.close();//關閉}
}
2.3.2客戶端代碼如下:

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;public class SocketTCP01Client03 {public static void main(String[] args) throws IOException {//1. 連接服務端 (ip, 端口)//解讀: 連接本機的 9999端口, 如果連接成功,返回Socket對象Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//這里使用的是本機,如果是遠程服務器改為對應的IP或域名System.out.println("客戶端 socket 返回=" + socket.getClass());//2. 連接上后,生成Socket, 通過socket.getOutputStream()//得到 和 socket對象關聯的輸出流對象OutputStream outputStream = socket.getOutputStream();//字節流轉換成字符流BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("hello server 字符流");bufferedWriter.newLine();//插入一個換行符,表示寫入的內容結束, 注意,要求對方使用readLine()!!!!bufferedWriter.flush(); //如果使用的字符流,需要手動刷新,否則數據不會寫入數據通道無上一個案例的結束標記   InputStream inputStream = socket.getInputStream();//將字節流轉換成字符流BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String str = bufferedReader.readLine();System.out.println(str);bufferedReader.close();bufferedWriter.close();socket.close();}
}

2.4題目四(網絡上傳文件-字節流)要求如下:

  1. 編寫一個服務端,和一個客戶端
  2. 服務器端在 8888 端口監聽
  3. 客戶端連接到服務端,發送一張圖片 e:\qie.png
  4. 服務器端接收到客戶端發送的圖片,保存到 src 下,發送 “收到圖片” 再退出
  5. 客戶端接收到服務端發送的 “收到圖片”,再退出
  6. 該程序要求使用 StreamUtils.java,我們直接使用
2.4.1工具包StreamUtils代碼如下:

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;/*** 此類用于演示關于流的讀寫方法**/
public class StreamUtils {/*** 功能:將輸入流轉換成byte[], 即可以把文件的內容讀入到byte[]* @param is* @return* @throws Exception*/public static byte[] streamToByteArray(InputStream is) throws Exception{ByteArrayOutputStream bos = new ByteArrayOutputStream();//創建輸出流對象byte[] b = new byte[1024];//字節數組int len;while((len=is.read(b))!=-1){//循環讀取bos.write(b, 0, len);//把讀取到的數據,寫入bos	}byte[] array = bos.toByteArray();//然后將bos 轉成字節數組bos.close();return array;}/*** 功能:將InputStream轉換成String* @param is* @return* @throws Exception*/public static String streamToString(InputStream is) throws Exception{BufferedReader reader = new BufferedReader(new InputStreamReader(is));StringBuilder builder= new StringBuilder();String line;while((line=reader.readLine())!=null){builder.append(line+"\r\n");}return builder.toString();}}
2.4.2服務端代碼如下:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;//文件上傳的服務端
public class TCPFileUploadServer001 {public static void main(String[] args) throws Exception {//1.服務端在本機監聽8888ServerSocket serverSocket = new ServerSocket(8888);System.out.println("服務端在8888端口監聽....");//2.等待連接Socket socket=serverSocket.accept();//3. 讀取客戶端發送的數據//通過Socket 得到輸入流BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());byte[] bytes = StreamUtils.streamToByteArray(bis);//4. 將得到 bytes 數組,寫入到指定的路徑,就得到一個文件了String destFilePath = "D:\\IDEA\\project\\chapter21\\Java002.png";BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));bos.write(bytes);bos.close();// 向客戶端回復 "收到圖片"// 通過socket 獲取到輸出流(字符)BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));writer.write("收到圖片");writer.flush();//把內容刷新到數據通道socket.shutdownOutput();//設置寫入結束標記//關閉其他資源//writer.close();bis.close();socket.close();serverSocket.close();}
}
2.4.3客戶端代碼如下:

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;//文件上傳的客戶端
public class TCPFileUploadClient001 {public static void main(String[] args) throws Exception {//客戶端連接服務端 8888,得到Socket對象Socket socket = new Socket(InetAddress.getLocalHost(), 8888);//創建讀取磁盤文件的輸入流String filePath = "D:\\IDEA\\project\\chapter21\\Java.png";//String filePath = "e:\\abc.mp4";BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));//bytes 就是 filePath 對應的字節數組byte[] bytes = StreamUtils.streamToByteArray(bis);//通過socket 獲取到輸出流, 將bytes數據發送給服務端BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());bos.write(bytes);//將文件對應的字節數組的內容,寫入到數據通道bis.close();socket.shutdownOutput();//設置寫入數據的結束標記//=====接收從服務端回復的消息=====InputStream inputStream = socket.getInputStream();//使用StreamUtils 的方法,直接將 inputStream 讀取到的內容 轉成字符串String s = StreamUtils.streamToString(inputStream);System.out.println(s);//關閉相關的流inputStream.close();bos.close();socket.close();}
}

五、UDP 網絡通信編程[了解]

1.基本介紹

  1. 類 DatagramSocket 和 DatagramPacket [數據包 / 數據報] 實現了基于 UDP 協議網絡程序。
  2. UDP 數據報通過數據報套接字 DatagramSocket 發送和接收,系統不保證 UDP 數據報一定能夠安全送到目的地,也不能確定什么時候可以抵達。
  3. DatagramPacket 對象封裝了 UDP 數據報,在數據報中包含了發送端的 IP 地址和端口號以及接收端的 IP 地址和端口號。
  4. UDP 協議中每個數據報都給出了完整的地址信息,因此無須建立發送方和接收方的連接

2. 基本流程

  1. 核心的兩個類 / 對象 DatagramSocket 與 DatagramPacket
  2. 建立發送端,接收端 (沒有服務端和客戶端概念)
  3. 發送數據前,建立數據包 / 報 DatagramPacket 對象
  4. 調用 DatagramSocket 的發送、接收方法
  5. 關閉 DatagramSocket

3.應用案例

3.1要求如下:
  1. 編寫一個接收端 A, 和一個發送端 B
  2. 接收端 A 在 9999 端口等待接收數據 (receive)
  3. 發送端 B 向接收端 A 發送 數據 "hello,明天吃火鍋~"
  4. 接收端 A 接收到 發送端 B 發送的數據, 回復 "好的,明天見", 再退出
  5. 發送端接收 回復的數據,再退出
3.2接受端代碼如下:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class UDPReceiverA {public static void main(String[] args) throws IOException {//1. 創建一個 DatagramSocket 對象,準備在9999接收數據DatagramSocket socket = new DatagramSocket(9999);//UDP 協議數據包最大 64k//2. 構建一個 DatagramPacket 對象,準備接收數據byte[] buf = new byte[1024];// 在前面講解UDP 協議時,老師說過一個數據包最大 64kDatagramPacket 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);///==========回復代碼====================//2. 將需要發送的數據,封裝到 DatagramPacket對象byte[] data1 = "好的,明天見".getBytes();//說明: 封裝的 DatagramPacket 對象 data 內容字節數組 ,data.length , 主機(IP), 端口DatagramPacket packet1 = new DatagramPacket(data1, data1.length, InetAddress.getByName("113.54.254.61"), 9998);socket.send(packet1);socket.close();System.out.println("A端退出");}
}
3.3發送端代碼如下:
import java.io.IOException;
import java.net.*;public class UDPSenderB {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("113.54.254.61"), 9999);socket.send(packet);==============收到回復======================//UDP 協議數據包最大 64k//2. 構建一個 DatagramPacket 對象,準備接收數據byte[] buf = new byte[1024];// 在前面講解UDP 協議時,老師說過一個數據包最大 64kDatagramPacket packet1 = new DatagramPacket(buf, buf.length);//3. 調用 接收方法, 將通過網絡傳輸的 DatagramPacket 對象// 填充到 packet對象// 當有數據包發送到 本機的9999端口時,就會接收到數據//如果沒有數據包發送到 本機的9999端口, 就會阻塞等待.System.out.println("接收端 B等待回復..");socket.receive(packet1);//4. 可以把packet 進行拆包,取出數據,并顯示.int length = packet1.getLength();//實際接收到的數據字節長度byte[] data1 = packet1.getData();//接收到數據String s = new String(data1, 0, length);System.out.println(s);//關閉資源socket.close();System.out.println("B端退出");}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898118.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Json—RPC框架】:宏定義不受命名空間限制,續行符的錯誤使用造成的bug

為什么不受命名空間的限制? 宏處理在預處理階段, 預處理在編譯之前,編譯才進行語法分析,語義分析。命名空間也只能限制這部分。 在Json-RPC框架的實現中,遇到如下問題。一開始以為是在實現日志宏的時候,有…

四川省包含哪些水系

背景: 想知道四川省包含哪些水系,以及各個水系的分布,起點、流經省市、終點等 {label: "嘉陵江",value: "嘉陵江",},{label: "渠江",value: "渠江",},{label: "涪江",value: "涪江&q…

子序列問題寫法

子序列問題可以按照動態規劃的思想去寫。 子序列問題類型 子序列 是由數組派生而來的序列,刪除(或不刪除)數組中的元素而不改變其余元素的順序。 例如,[3,6,2,7] 是數組 [0,3,1,6,2,2,7] 的子序列。 寫法思路 創建兩層for循環…

C++ primer plus 使用類下

目錄 前言 一 轉換函數 總結 前言 接著上一章的內容 一 轉換函數 接著我們上一章節的內容,我們知道我們類里面有一個自動轉換利用這個運算符,這樣就可以使得對象可以接受這個值 那么有沒有可以使一個普通類型去接收一個對象呢? 答案是…

聲網自研算法如何重定義AI交互容災標準

在咖啡廳里,當我把手機置于咖啡機與微波爐形成的電磁干擾區時,WiFi丟包率飆升至83%,但AI的回應延遲僅從1.2秒增至1.4秒。這背后是聲網自研的Phoenix抗弱網算法在發揮作用,通過AI驅動的動態FEC(前向糾錯)機制…

詳解布隆過濾器及其模擬實現

目錄 布隆過濾器 引入 概念 工作原理 模擬實現布隆過濾器 哈希函數集 布隆過濾器基本框架 add函數(添加到布隆過濾器中) contains函數(判斷是否存在該值) 完整代碼 布隆過濾器的刪除 布隆過濾器的誤判率 布隆過濾器的…

巧用 VSCode 與 AI 編碼提升 Vue 前端開發效率

在當今快節奏的軟件開發領域,提升開發效率是每個開發者都追求的目標。對于 Vue 前端開發而言,Visual Studio Code(VSCode)已經成為了眾多開發者的首選編輯器。而隨著人工智能技術的發展,各類 AI 編碼擴展工具如雨后春筍…

5分鐘快速申請一個EDU教育郵箱

感謝CSDN作者 CodeDevMaster 于 2023-10-16 13:22:40 發布作品《5分鐘快速申請一個EDU教育郵箱》 本文內容為作者方法的實踐與復刻,同時 現在是2025/03/17,執行的細節有部分變動,所以完整展示一波。 祝各位好運,同時本案例中展示…

Go string 字符串底層邏輯

在 Go 語言中,string 類型的底層結構是一個結構體,包含兩個字段:一個指向字節數組的指針和該字節數組的長度。以下是其在 Go 源碼中的大致定義:type stringStruct struct {str unsafe.Pointerlen int } str:這是一個指…

【NLP】10. 機器學習模型性能評估指標(含多類別情況), ROC,PRC

機器學習模型性能評估指標(含多類別情況) 1. 模型評估指標簡介 在機器學習中,模型的性能評估非常重要。常用的模型評估指標有: 準確率(Accuracy)精度(Precision)召回率&#xff0…

開源通義萬相本地部署方案,文生視頻、圖生視頻、視頻生成大模型,支持消費級顯卡!

開源通義萬相本地部署方案,文生視頻、圖生視頻、視頻生成大模型,支持消費級顯卡! 萬相2.1開源 近日,大模型萬相2.1(Wan)重磅開源,此次開源采用Apache2.0協議,14B和1.3B兩個參數規格…

機器學習與深度學習中模型訓練時常用的四種正則化技術L1,L2,L21,ElasticNet

L1正則化和L2正則化是機器學習中常用的兩種正則化方法,用于防止模型過擬合。它們的區別主要體現在數學形式、作用機制和應用效果上。以下是詳細對比: 1. 數學定義 L1正則化(也叫Lasso正則化): 在損失函數中加入權重參…

qt+opengl 播放yuv視頻

一、實現效果 二、pro文件 Qt widgets opengl 三、主要代碼 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…

Android開源庫——RxJava和RxAndroid

RxJava和RxAndroid是什么? RxJava是基于JVM的響應式擴展,用于編寫異步代碼 RxAndroid是關于Android的RxJava綁定 RxJava和RxAndroid使用 依賴 implementation io.reactivex.rxjava3:rxjava:3.1.0 implementation io.reactivex.rxjava3:rxandroid:3.…

并發基礎—三大問題:可見性、原子性、有序性

文章目錄 可見性原子性有序性(指令重排)經典的指令重排案例:單例模式的雙重檢查鎖volatile和synchronize都可以保證有序性并發壓測工具Jcstress證明指令重排會在多線程下出現問題(了解)CPU緩存分為三個級別&#xff1a…

PyTorch 入門學習

目錄 PyTorch 定義 核心作用 應用場景 Pytorch 基本語法 1. 張量的創建 2. 張量的類型轉換 3. 張量數值計算 4. 張量運算函數 5. 張量索引操作 6. 張量形狀操作 7. 張量拼接操作 8. 自動微分模塊 9. 案例-線性回歸案例 PyTorch 定義 PyTorch 是一個基于 Python 深…

Hive SQL 精進系列:REGEXP_REPLACE 函數的用法

目錄 一、引言二、REGEXP_REPLACE 函數基礎2.1 基本語法參數詳解2.2 簡單示例 三、REGEXP_REPLACE 函數的應用場景3.1 去除特殊字符3.2 統一字符串格式 四、REGEXP_REPLACE 與 REPLACE 函數的對比4.1 功能差異4.2 適用場景 五、REGEXP_REPLACE 與 REGEXP 函數的對比5.1 功能差異…

從0開始搭建微服務架構特別篇SpringCloud網關聚合knife4j

前言:總所周知項目開發接口測試需要knife4j,但是,微服務架構中微服務很多,模塊地址很多,需要統一管理api測試,就需要聚合在網關統一調用,本章,就說明如何通過網關聚合使用knife4j。 …

Spring Cloud 中的服務注冊與發現: Eureka詳解

1. 背景 1.1 問題描述 我們如果通過 RestTamplate 進行遠程調用時,URL 是寫死的,例如: String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 當機器更換或者新增機器時,這個 URL 就需要相應地變…

網頁制作15-Javascipt時間特效の記錄網頁停留時間

01效果圖: 02運用: window.setTimeout()刷新function()函數document.forms():表單if條件語句window.alert()窗口警示 03、操作代碼:…