實現回顯服務器(基于UDP)

目錄

一.回顯服務器的基本概念

二.回顯服務器的簡單示意圖

三.實現回顯服務器(基于UDP)必須要知道的API?

1.DatagramSocket

2.DatagramPacket?

3.InetSocketAddress

4.二者區別?

1. 功能職責

2. 核心作用

3. 使用場景流程

四.實現服務器端的主要思路?

代碼部分如下

實現服務器端的注意事項?

五.實現客戶端的主要思路

實現客戶端的注意事項?

六.完整代碼?

運行測試結果?


一.回顯服務器的基本概念

回顯服務器(Echo)可以看成是網絡編程中的"hello world",是學習網絡編程的入門。簡單介紹一下,回顯服務器就是服務端收到什么,就給客戶端發送什么。我會基于UDP來實現一個回顯服務器。

二.回顯服務器的簡單示意圖

三.實現回顯服務器(基于UDP)必須要知道的API?

1.DatagramSocket

方法簽名方法說明
DatagramSocket創建一個 UDP 數據報套接字的 Socket,綁定到本機指定的端口(一般用于服務端)
DatagramSocket(int port)創建一個 UDP 數據報套接字的 Socket,綁定到本機任意一個隨機端口(一般用于客戶端)

void receive(DatagramPacket p)

???

從此套接字接收數據報(如果沒有接收到數據報,該方法會阻塞等待
void send(DatagramPacket p)從此套接字發送數據報(不會阻塞等待,直接發送)
void close()關閉此數據報套接字

2.DatagramPacket?

方法簽名方法說明
DatagramPacket(byte[] buf, int length)構造一個DatagramPacket以用來接收數據報,接收的數據保存在字節數組(第一個參數buf)中,接收指定長度(第二個參數length
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)構造一個DatagramPacket以用來發送數據報,發送的數據為字節數組(第一個參數buf)中,從0到指定長度(第二個參數length)。address指定目的主機的IP和端口號
InetAddress getAddress()從接收的數據報中,獲取發送端主機IP地址;或從發送的數據報中,獲取接收端主機IP地址
int getPort()從接收的數據報中,獲取發送端主機的端口號;或從發送的數據報中,獲取接收端主機端口號
byte[] getData()獲取數據報中的數據

3.InetSocketAddress

方法簽名方法說明
InetSocketAddress(InetAddress addr, int port)創建一個 Socket 地址,包含 IP 地址和端口號

4.二者區別?

1. 功能職責

  • DatagramSocket:是套接字類,相當于 “碼頭”,負責發送、接收DatagramPacket數據報,還能綁定端口、管理網絡連接(雖 UDP 無連接,但它提供收發的基礎通道 ),比如通過send發送數據報、receive接收數據報,close關閉套接字。
  • DatagramPacket:是數據報類,相當于 “集裝箱”,負責封裝 UDP 通信中要發送或接收的數據,包含數據內容、數據長度,以及發送 / 接收時的目標地址(IP + 端口 )或源地址信息。

2. 核心作用

  • DatagramSocket聚焦網絡收發操作,決定 “怎么傳”(用哪個端口、怎么建立收發通道 );
  • DatagramPacket聚焦數據封裝,決定 “傳什么”(數據內容 )和 “傳給誰 / 從哪收”(地址信息 ) 。

3. 使用場景流程

UDP 通信時,先創建DatagramSocket作為收發的 “通道”,再創建DatagramPacket封裝數據 / 地址,最后通過DatagramSocketsend/receive完成數據收發 。比如客戶端用DatagramSocket發送封裝了數據和目標地址的DatagramPacket;服務器端用DatagramSocket綁定端口,接收包含數據和源地址的DatagramPacket?。

四.實現服務器端的主要思路?

1.讀取請求并解析

2.根據請求,計算響應

3.把響應返回給客戶端

4.打印日志(方便觀察)

代碼部分如下

public void start() throws IOException {while(true){//1.讀取請求并解析DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);//輸出型參數socket.receive(requestPacket);String request=new String(requestPacket.getData(),0,requestPacket.getLength());//2.根據請求,計算響應String response=process(request);//3.把響應返回給客戶端DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);//4.打印日志System.out.printf("[%s:%d,request:%s response:%s]\n",requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);}}

實現服務器端的注意事項?

五.實現客戶端的主要思路

1.在控制臺讀取用戶要輸入的內容

2.把請求發送給服務器

3.發送請求數據包給服務器端

4.接收服務器端的響應

5.把從服務器讀取的數據進行解析,打印出來

  public void start() throws IOException {Scanner scanner=new Scanner(System.in);while(true){System.out.println("請輸入內容");//按ctrl+d會breakif(!scanner.hasNext()){break;}//1。從控制臺讀取用戶要輸入的內容String resquest=scanner.next();//2.把請求發送給服務器DatagramPacket resquestPacket=new DatagramPacket(resquest.getBytes(),resquest.getBytes().length,InetAddress.getByName(ServerIp),ServerPort);
//            socket.receive(resquestPacket);//3.發送請求數據包給服務器端socket.send(resquestPacket);//4.接收服務器端的響應DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);//5.把從服務器讀取的數據進行解析,打印出來String response=new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}

實現客戶端的注意事項?

六.完整代碼?

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;public class UdpEchoClient {private DatagramSocket socket=null;//記錄ip與端口號private String ServerIp;private int ServerPort;//服務器的ip與端口號public UdpEchoClient(String ServerIp,int ServerPort) throws SocketException {this.ServerIp=ServerIp;this.ServerPort=ServerPort;//客戶端這里的端口號等到操作系統隨機分配socket=new DatagramSocket();}public void start() throws IOException {Scanner scanner=new Scanner(System.in);while(true){System.out.println("請輸入內容");//按ctrl+d會breakif(!scanner.hasNext()){break;}//1。從控制臺讀取用戶要輸入的內容String resquest=scanner.next();//2.把請求發送給服務器DatagramPacket resquestPacket=new DatagramPacket(resquest.getBytes(),resquest.getBytes().length,InetAddress.getByName(ServerIp),ServerPort);
//            socket.receive(resquestPacket);//3.發送請求數據包給服務器端socket.send(resquestPacket);//4.接收服務器端的響應DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);//5.把從服務器讀取的數據進行解析,打印出來String response=new String(responsePacket.getData(),0,responsePacket.getLength());System.out.println(response);}}public static void main(String[] args) throws IOException {UdpEchoClient udpEchoClient=new UdpEchoClient("127.0.0.1",1777);udpEchoClient.start();}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class UdpEchoServer {private DatagramSocket socket=null;public UdpEchoServer(int port) throws SocketException {socket=new DatagramSocket(port);}public void start() throws IOException {while(true){//1.讀取請求并解析DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);//輸出型參數socket.receive(requestPacket);String request=new String(requestPacket.getData(),0,requestPacket.getLength());//2.根據請求,計算響應String response=process(request);//3.把響應返回給客戶端DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);//4.打印日志System.out.printf("[%s:%d,request:%s response:%s]\n",requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);}}//將private改為public,方便方面有新功能,可以進行重寫public String process(String request) {return request;}public static void main(String[] args) throws IOException {UdpEchoServer udpEchoServer=new UdpEchoServer(1777);udpEchoServer.start();}
}

運行測試結果?

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

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

相關文章

LabVIEW電液伺服閥自動測試

針對航空航天及工業液壓領域電液伺服閥測試需求,采用 LabVIEW 圖形化編程平臺,集成 NI、GE Druck 等品牌硬件,構建集靜態特性(流量/ 壓力 / 泄漏)與動態特性(頻率響應)測試于一體的自動化系統&a…

性能優化 - 高級進階: Spring Boot服務性能優化

文章目錄 Pre引言:為何提前暴露指標與分析的重要性指標暴露與監控接入Prometheus 集成 性能剖析工具:火焰圖與 async-profilerasync-profiler 下載與使用結合 Flame 圖優化示例 HTTP 及 Web 層優化CDN 與靜態資源加速Cache-Control/Expires 在 Nginx 中配…

力扣網C語言編程題:除自身以外數組的乘積

一. 簡介 本文記錄力扣網上涉及數組方面的編程題,主要以 C語言實現。 二. 力扣上C語言編程題:涉及數組 題目:除自身以外數組的乘積 給你一個整數數組 nums,返回 數組 answer ,其中 answer[i] 等于 nums 中除 nums[i…

SpringBoot擴展——發送郵件!

發送郵件 在日常工作和生活中經常會用到電子郵件。例如,當注冊一個新賬戶時,系統會自動給注冊郵箱發送一封激活郵件,通過郵件找回密碼,自動批量發送活動信息等。郵箱的使用基本包括這幾步:先打開瀏覽器并登錄郵箱&…

【html】iOS26 液態玻璃實現效果

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>液體玻璃效果演示</title><style>bo…

探索算法秘境:量子隨機游走算法及其在圖論問題中的創新應用

目錄 ?編輯 一、量子隨機游走算法的起源與原理 二、量子隨機游走算法在圖論問題中的創新應用 三、量子隨機游走算法的優勢與挑戰 四、結語 在算法研究的浩瀚星空中&#xff0c;總有一些領域如同遙遠星系&#xff0c;閃爍著神秘而誘人的光芒。今天&#xff0c;我們將一同深…

C# 一維數組和矩形數組全解析

在編程的世界里&#xff0c;數組是一種非常重要的數據結構。今天&#xff0c;我們就來詳細了解一下一維數組和矩形數組。 數組基礎認知 數組實例是從 System.Array 繼承類型的對象。由于它從 BCL 基類派生而來&#xff0c;所以繼承了許多有用的成員&#xff1a; Rank 屬性&a…

WebStorm編輯器側邊欄

目錄 編輯器側邊欄行號配置行號隱藏行號 代碼折疊側邊欄圖標書簽添加匿名書簽添加助記符書簽 運行和調試管理斷點配置斷點圖標 版本控制配置Git Blame注釋 編輯器側邊欄 編輯器左側的垂直區域。當編寫代碼時&#xff0c;提供重要信息和操作圖標。外觀和行為可以根據你的喜好進…

騰訊云TCCA認證考試報名 - TDSQL數據庫交付運維工程師(PostgreSQL版)

數據庫交付運維工程師-騰訊云TDSQL(PostgreSQL版)認證 適合人群&#xff1a; 適合從事TDSQL(PostgreSQL版)交付、運維、售前咨詢以及TDSQL(PostgreSQL版)相關項目的管理人員。 認證考試 單選*40道多選*20道 成績查詢 70分及以上通過認證&#xff0c;官網個人中心->認證考…

attn_mask 為 (1, 1) 時什么意思? 7,7又是什么意思?

在深度學習中&#xff0c;特別是在 Transformer 模型和注意力機制&#xff08;Attention Mechanism&#xff09;中&#xff0c;attn_mask&#xff08;注意力掩碼&#xff09;是一個用于控制注意力計算的張量。它決定了在計算注意力分數時&#xff0c;哪些位置應該被關注&#x…

Qt聯合Halcon開發二:Halcon窗口綁定Qt控件顯示Hobject圖像【詳細圖解流程】

1. 項目準備 在本項目中&#xff0c;我們將使用Qt框架與Halcon庫結合&#xff0c;展示圖像并進行圖像處理。首先&#xff0c;確保你已經配置好Qt和Halcon的開發環境。 環境配置可查看上篇文章 2. 創建Qt界面 在Qt中&#xff0c;創建一個窗口并拖入按鈕和Graphics View控件。G…

Redis 持久化機制詳解:RDB、AOF 原理與面試最佳實踐(AOF篇)

在上一章我們深入學習了 Redis 中重要的數據持久化機制 ——RDB&#xff08;Redis Database&#xff09;&#xff0c;了解了其通過周期性快照將數據以二進制文件形式保存到磁盤的原理&#xff0c;包括觸發條件、文件結構以及優缺點等核心內容。 Redis 持久化機制詳解&#xff…

【GateWay】和權限驗證

【GateWay】網關詳解和權限驗證 一、Gateway 核心概念與架構二、路由斷言&#xff08;Route Predicates&#xff09;詳解三、過濾器&#xff08;Filters&#xff09;機制四、權限認證的核心理論模型五、Spring Cloud Gateway Security OAuth2 集成方案六、OAuth2.0 集成 一、…

QSqlDatabase: QSQLITE driver not loaded

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言可能的原因解決辦法1. 確認 SQLite 驅動插件文件2. 拷貝插件文件到應用程序目錄3. 設置插件搜索路徑4. 安裝 SQLite 依賴庫5. 解決 QCoreApplication 實例問題 …

20250619在榮品的PRO-RK3566開發板的Android13下解決海羅光電有限公司HL070T58C-05屏在啟動的時候出現白色條紋的問題【時序】

20250619在榮品的PRO-RK3566開發板的Android13下解決海羅光電有限公司HL070T58C-05屏在啟動的時候出現白色條紋的問題 2025/6/19 20:39 緣起&#xff1a;榮品的PRO-RK3566開發板的Android13下&#xff0c;點亮海羅光電有限公司HL070T58C-05屏。 在啟動的時候會出現花屏/白色條紋…

docker使用Volume對Nginx進行掛載

需求&#xff1a; 需要將Nginx的歡迎頁面也就是index.html文件進行修改。 原始方法&#xff1a;由于docker會為每一個容器創建其對應的文件信息&#xff0c;但是創建的信息內容只有其最基礎的運行信息&#xff0c;所以想要直接去訪問其index.html就無法做到。 使用volume&am…

基于springboot的寵物服務預約系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了六年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

idea 2025會在用戶目錄創建IdeaSnapshots文件夾

推薦一個api管理測試工具 一個簡單的API測試和編寫文檔的工具 idea 2025會在用戶目錄創建IdeaSnapshots文件夾 解決方案 打開 Profiler 點擊 setting 參考 https://youtrack.jetbrains.com/articles/SUPPORT-A-1086/How-to-change-or-turn-off-the-IdeaSnapshots-folder-…

【Mini-F5265-OB開發板試用測評】2、PWM驅動遙控車RX2接收解碼帶馬達驅動控制IC

手頭有帶轉向電機和動力電機小車底盤&#xff0c;買了很久一直在吃灰。 最近查了一下小車的驅動IC是富滿微的8D420L,是一款傳統的RX2接收解碼芯片&#xff0c;帶馬達驅動。 手頭沒有TX2發送芯片&#xff0c;所以考慮用MCU直接發送PWM直接接入RX2&#xff0c;可能可以驅動。 一…

Tcpdump網絡抓包工具詳解!

一、簡介 tcpdump就是&#xff1a;dump the traffic on a network&#xff0c;根據使用者的定義對網絡上的數據包進行截獲的包分析工具。 tcpdump是一個用于截取網絡分組&#xff0c;并輸出分組內容的工具。憑借強大的功能和靈活的截取策略&#xff0c;使其成為類UNIX系統下用…