Java 中通信接口

Java 中通信接口

  • 1、Java UDP 通信核心接口介紹
    • 1、DatagramSocket 類
    • 2、DatagramPacket 類
    • 3、UDP客戶端與UDP服務器通信例子
  • 2、Java TCP 通信核心接口介紹
    • 1、ServerSocket 類
    • 2、Socket 類
    • 3、輸入輸出流常見包裝類
    • 4、TCP 客戶端與 TCP 服務器通信例子

Java 網絡通信基于 Socket(套接字) 編程,分為兩大類:

協議特點
TCPSocket, ServerSocket面向連接、可靠、數據順序、有流控制
UDPDatagramSocket, DatagramPacket無連接、不可靠、快速、無序、面向數據報

1、Java UDP 通信核心接口介紹

你這個程序使用的是 UDP 協議,使用類有:

DatagramSocket:用于發送和接收數據包(Socket 實例)

DatagramPacket:用于封裝發送或接收的數據內容

1、DatagramSocket 類

這個類代表一個 UDP 套接字(Socket),可以發送或接收 DatagramPacket

DatagramSocket socket = new DatagramSocket();         // 客戶端:系統自動分配本地端口
DatagramSocket socket = new DatagramSocket(port);     // 服務器:綁定到指定端口
方法說明
send(DatagramPacket p)發送一個數據報
receive(DatagramPacket p)接收一個數據報(阻塞)
close()關閉套接字,釋放端口

UDP 是無連接的通信,所以只需要發送和接收數據報,不需要建立連接。

2、DatagramPacket 類

這個類是一個 數據包容器,既可以用于發送數據,也可以用于接收數據。

發送端構造方法:

DatagramPacket packet = new DatagramPacket(byte[] buf, int length, InetAddress address, int port);
參數說明
buf要發送的數據字節數組
length字節數組長度
address目標主機地址(InetAddress.getByName(“127.0.0.1”))
port目標端口號

接收端構造方法:

DatagramPacket packet = new DatagramPacket(byte[] buf, int length);
參數說明
buf用來接收數據的字節數組
length緩沖區大小

常用方法:

方法說明
getData()獲取數據字節數組(包含整個緩沖區)
getLength()獲取實際接收到的數據長度
getSocketAddress()獲取發送方的地址和端口
getAddress() / getPort()獲取 IP 地址 / 端口號

3、UDP客戶端與UDP服務器通信例子

下面是簡單清晰的 UDP 客戶端與服務器通信例子:

UdpEchoServer.java(服務器

package thread;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UdpEchoServer {public static void main(String[] args) throws IOException {// 創建 DatagramSocket,綁定端口 9090DatagramSocket socket = new DatagramSocket(9090);System.out.println("服務器已啟動,監聽端口 9090...");while (true) {// 接收客戶端發來的數據包byte[] buffer = new byte[1024]; // 緩沖區DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);socket.receive(receivePacket);  // 阻塞接收// 讀取數據內容String message = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("收到客戶端消息:" + message);// 構造響應內容(原樣返回加上后綴)String response = "回顯:" + message;byte[] responseData = response.getBytes();// 構造響應數據包,目標為收到的客戶端地址和端口DatagramPacket responsePacket = new DatagramPacket(responseData,responseData.length,receivePacket.getAddress(),receivePacket.getPort());// 發送響應數據包socket.send(responsePacket);}}
}

UdpEchoClient.java(客戶端

package thread;import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class UdpEchoClient {public static void main(String[] args) throws IOException {// 創建 DatagramSocket,系統自動分配端口DatagramSocket socket = new DatagramSocket();// 服務器地址和端口InetAddress serverAddress = InetAddress.getByName("127.0.0.1");int serverPort = 9090;Scanner scanner = new Scanner(System.in);System.out.println("請輸入內容,輸入 exit 退出:");while (true) {System.out.print(">> ");String input = scanner.nextLine();if ("exit".equalsIgnoreCase(input)) {break;}// 構造發送數據包byte[] data = input.getBytes();DatagramPacket sendPacket = new DatagramPacket(data, data.length, serverAddress, serverPort);socket.send(sendPacket);// 接收服務器響應byte[] buffer = new byte[1024];DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);socket.receive(receivePacket);// 打印響應String response = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("來自服務器:" + response);}socket.close();}
}

2、Java TCP 通信核心接口介紹

Java 中使用 TCP 協議 通信的主要類有:

Socket:表示客戶端或服務端通信時的“套接字”

ServerSocket:服務端專用,用于監聽客戶端連接請求

1、ServerSocket 類

ServerSocket 是服務端用來監聽某個端口的類,接收到連接請求后會生成 Socket 進行數據通信。

構造方法:

ServerSocket serverSocket = new ServerSocket(port); // 監聽指定端口

常用方法:

方法說明
accept()接收客戶端連接,返回一個 Socket,阻塞方法
close()關閉監聽,釋放端口資源

說明accept() 是阻塞的,直到有客戶端連接才會繼續執行。

2、Socket 類

Socket 表示客戶端套接字,也用于服務端與某個客戶端通信的 Socket 實例。

構造方法(客戶端使用)

ServerSocket serverSocket = new ServerSocket(port); // 監聽指定端口

常用方法:

方法說明
getInputStream()獲取輸入流,用于讀取數據(來自對方)
getOutputStream()獲取輸出流,用于發送數據(給對方)
close()關閉連接

3、輸入輸出流常見包裝類

包裝類組合用途
InputStreamReader + BufferedReader讀取字符串(按行讀取)
OutputStream + PrintWriter發送字符串(可自動 flush)

4、TCP 客戶端與 TCP 服務器通信例子

TCP 服務器(TcpEchoServer.java)

package thread;import java.io.*;
import java.net.*;public class TcpEchoServer {public static void main(String[] args) throws IOException {// 1. 創建 ServerSocket,監聽端口 9090ServerSocket serverSocket = new ServerSocket(9090);System.out.println("TCP服務器啟動,監聽端口 9090...");// 2. 等待客戶端連接(阻塞)Socket clientSocket = serverSocket.accept();System.out.println("客戶端已連接:" + clientSocket.getRemoteSocketAddress());// 3. 獲取輸入輸出流BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true); // 自動刷新// 4. 循環讀取客戶端消息并回顯String message;while ((message = reader.readLine()) != null) {System.out.println("客戶端說:" + message);writer.println("回顯:" + message);}// 5. 關閉連接reader.close();writer.close();clientSocket.close();serverSocket.close();}
}

TCP 客戶端(TcpEchoClient.java)

package thread;import java.io.*;
import java.net.*;
import java.util.Scanner;public class TcpEchoClient {public static void main(String[] args) throws IOException {// 1. 創建 Socket,連接到服務器Socket socket = new Socket("127.0.0.1", 9090);System.out.println("已連接到服務器!");// 2. 獲取輸入輸出流BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); // 自動刷新Scanner scanner = new Scanner(System.in);System.out.println("請輸入要發送的內容,輸入 exit 退出:");// 3. 發送和接收消息while (true) {System.out.print(">> ");String input = scanner.nextLine();if ("exit".equalsIgnoreCase(input)) {break;}writer.println(input); // 發送數據String response = reader.readLine(); // 接收響應System.out.println("服務器回復:" + response);}// 4. 關閉連接socket.close();}
}

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

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

相關文章

樹種識別與碳儲量計算:基于多源遙感數據與深度學習的融合框架

樹種識別與碳儲量計算:基于多源遙感數據與深度學習的融合框架 1. 引言:背景與意義 森林作為陸地生態系統的主體,在全球碳循環中扮演著至關重要的角色。精準估算森林生物量及其蘊含的碳儲量,是評估區域乃至全球碳收支、應對氣候變化、制定森林管理策略的核心科學問題。傳統…

如何高效地將照片從 Android 傳輸到計算機

“如何將圖片從 Android 設備傳輸到筆記本電腦?”我們在 Quora 上發現了這個問題,這篇文章中有不同的答案。如果您對此感到好奇,請不要錯過這篇文章,因為在檢查所有答案和其他在線帖子并進行測試后,我們整理了 6 種經過…

httpget請求與獲取返回值

首先需要在pom中添加對應包信息 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> </dependency> <dependency><groupId>com.alibaba<…

Rust交互式編程環境Jupyter Lab搭建

windows 11wsl2Ubuntu 24.04.1 LTS Installer.exerust-1.88.0-x86_64-unknown-linux-gnu.tar.xzevcxr_jupyter-v0.20.0-x86_64-unknown-linux-gnu.tar.gzMiniconda3-py312_25.1.1-2-Linux-x86_64.sh /etc/apt/sources.list配置鏡像源&#xff08;最好先刪除sources.list.d的官…

理解WebGL中的頂點著色器和片元著色器

WebGL是一種基于OpenGL ES的JavaScript API&#xff0c;它允許我們在網頁上直接渲染3D圖形而無需任何插件。WebGL的核心是著色器編程&#xff0c;它主要包含兩種著色器&#xff1a;頂點著色器(Vertex Shader)和片元著色器(Fragment Shader)。 頂點著色器負責處理每個頂點的位置…

從UI設計到數字孿生:構建智慧城市的數據可視化體系

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在城市化進程加速與數字化轉型的雙重驅動下&#xff0c;智慧城市正從概念走向落地 —— 據 ID…

OpenCV圖像旋轉:單點旋轉與圖片旋轉

1. 引言 圖像旋轉是計算機視覺中最基礎也是最重要的幾何變換之一&#xff0c;在圖像處理、計算機視覺、醫學影像分析等領域有著廣泛應用。OpenCV作為最流行的計算機視覺庫&#xff0c;提供了強大的圖像旋轉功能。本文將深入探討OpenCV中的兩種旋轉方式&#xff1a;基于單點的仿…

yolov11安裝,訓練模型,tensorrtx加速,Qt預測圖像

文章目錄 一. yolov11 python環境安裝二. windows10下yolov11 tensorrtx推理加速三. windows10下qt調用tensorrtx加速的yolov11進行檢測 一. yolov11 python環境安裝 基礎環境 CUDA&#xff1a;cuda_11.8.0_522.06_windows cudnn&#xff1a;cudnn-windows-x86_64-8.6.0.163_c…

生物化學 PCR(聚合酶鏈式反應)引物 制造(固相磷酰胺化學法) 購買 存儲

引物&#xff08;Primer&#xff09; 引物&#xff08;Primer&#xff09;是一小段單鏈 DNA&#xff08;通常 18~25 個堿基&#xff09;&#xff0c;與模板 DNA 的特定位點互補。包括&#xff1a;Forward Primer&#xff08;正向引物&#xff09;和 Reverse Primer&#xff08…

SQL server 獲取表中所有行的序號 不夠四位數的前面補0

在 SQL Server 中&#xff0c;如果你想要為表中的行編號&#xff08;即序號&#xff09;添加前導零&#xff0c;以便它們總是呈現為四位數&#xff0c;你可以使用多種方法來實現這一點。以下是幾種常用的方法&#xff1a; 方法1&#xff1a;使用 RIGHT 和 REPLICATE 函數 如果…

熱門話題!網關模塊解決AB機器人和電壓控制器EtherCAT轉Ethernet/IP難題

網關模塊&#xff1a;解決AB機器人與電壓控制器通訊難題 在現代工業自動化生產中&#xff0c;不同設備之間的通信與協同至關重要。然而&#xff0c;由于設備品牌、型號以及所采用的通信協議各異&#xff0c;常常會出現通信兼容性問題。本案例將詳細介紹如何運用捷米特JM-ECTM-E…

將attribute數據動態寫入到excel上

將attribute數據動態寫入到excel上 顯示效果&#xff1a; I 大體思路&#xff1a; excel range name就設置為attribute_數字_類型&#xff0c;在創建template的時候&#xff0c;通過API得到這個event有幾個attribute&#xff0c;就創建幾列&#xff0c;同時還要根據不同的類…

Stable Diffusion入門-ControlNet 深入理解 第一課:ControlNet,控制AI繪圖的“大殺器”

大家好&#xff0c;歡迎來到Stable Diffusion入門-ControlNet深入理解系列的第一課&#xff01; 今天&#xff0c;我們要聊聊一個讓AI繪畫從“盲目生成”走向“精準控制”的神奇插件——ControlNet。 它就像一位無聲的魔術師&#xff0c;把原本隨意的AI生成圖片變得有條不紊、…

新生代潛力股劉小北:演藝路上的璀璨新星

在娛樂圈新人輩出的當下&#xff0c;一位來自四川的年輕演員正憑借著自己獨特的魅力和扎實的演技&#xff0c;悄然走進觀眾的視野&#xff0c;他就是劉小北。1998年出生的劉小北&#xff0c;畢業于四川電影電視學院&#xff0c;自踏入演藝圈以來&#xff0c;便以堅定的步伐在演…

強制IDEA始終使用Java 8

解決IDEA總是使用Java 21而非Java 8編譯的問題 您遇到的問題是典型的IDE內置JDK與項目沖突的情況。即使系統只安裝了Java 8&#xff0c;IntelliJ IDEA仍內置有最新的Java運行時&#xff0c;導致它使用Java 21來編譯您的代碼。 解決方案&#xff1a;強制IDEA始終使用Java 8 1…

青少年編程與數學 01-012 通用應用軟件簡介 14 詞典及翻譯資源

青少年編程與數學 01-012 通用應用軟件簡介 14 詞典及翻譯資源 一、什么是詞典及翻譯資源&#xff08;一&#xff09;詞典及翻譯資源的基本定義&#xff08;二&#xff09;詞典及翻譯資源的工作原理&#xff08;三&#xff09;詞典及翻譯資源的類型 二、詞典及翻譯資源的重要意…

AI測試革命:5分鐘自動生成單元測試|覆蓋率和邊界測試實戰指南

AI測試革命&#xff1a;5分鐘自動生成單元測試&#xff5c;覆蓋率和邊界測試實戰指南 你是否曾為編寫測試用例絞盡腦汁&#xff1f;是否因遺漏邊界條件導致上線后BUG頻發&#xff1f;告別低效測試&#xff0c;掌握AI賦能的現代化測試策略&#xff01; 一、為什么我們需要AI測試…

n8n Docker Compose部署

n8n Docker Compose 部署官方文檔詳細總結 1. 前提條件 具備服務器、容器、網絡和安全相關基礎知識。推薦有 Linux 運維經驗。已準備好一臺服務器&#xff08;建議為云服務器或本地服務器&#xff09;。 2. 安裝 Docker 和 Docker Compose 以 Ubuntu 為例&#xff0c;完整命…

Talk is cheap. Show me the code.手搓一個 Wayland 客戶端程序

前幾天我寫了一篇萬字長文《萬字長文詳解 Wayland 協議、架構》&#xff0c;但光講協議分析難免有些枯燥。畢竟&#xff0c;程序員更信奉那句名言&#xff1a;Talk is cheap. Show me the code. 所以這篇文章不打算長篇大論&#xff0c;而是通過編寫一個簡單的 Wayland 客戶端程…

Golang JSON 標準庫用法詳解

JSON (JavaScript Object Notation) 是一種輕量級的數據交換格式&#xff0c;Go語言的標準庫encoding/json提供了強大的JSON處理能力。下面我將詳細介紹各種用法并提供示例代碼。 1. 基本編碼&#xff08;Marshal&#xff09; 將Go數據結構轉換為JSON字符串。 package maini…