網絡編程1(UDP)

網絡編程套接字(socket api)

了解了網絡的一些概念,接下來就要進行網絡中的跨主機通信,了解網絡中的一些API,這里談到的API都是針對傳輸層進行的,這是因為我們編寫的代碼是在應用層,而傳輸層就是到了計算機內核中操作系統中已經實現好了的,編寫網絡編程代碼就是調用系統API,將數據傳輸到傳輸層,傳輸層->物理層就由操作系統進行。

將應用層數據傳輸到傳輸層的這些API就叫做socket api(網絡編程套接字),要將數據傳輸到傳輸層就要了解傳輸層中涉及到的協議:TCP,UDP,這兩個協議涉及到兩組不同的socket api,要分別進行討論。

TCP:有連接,可靠傳輸,面向字節流,全雙工。

UDP:無連接,不可靠傳輸,面向數據包,全雙工。

連接:有無連接就是通信雙方是否保存對方信息。

可靠/不可靠傳輸:可靠傳輸就是會在發出數據報后盡可能的保證能到達對端,不可靠就是在發出數據包后不管了。

全雙工:一個信道,可以雙向傳輸。

UDP socket

DatagramSocket

網卡:網卡等硬件設備就是通過文件進行封裝的,通過網絡發送數據,就是往網卡里接收數據;通過網絡接收信息,就是往網卡里讀取數據,封裝網卡的文件,就是socket文件。

而創建一個DatagramSocket對象就是在操作系統中創建一個socket文件,通過這個對象寫入數據,就是通過網卡發送數據;通過對象讀取數據,就是通過網卡接收數據。

DatagramSocket中的一些方法receive(接收一個數據報),send(發送一個數據報),close。

DatagramPacket

datagrampacket代表著一個UDP中傳輸數據的基本單位,也就是一個數據報。

編寫一個簡單的網絡程序

一個網絡程序一般是由客戶端和服務器構成的,這里只考慮一個客戶端和一個服務器,并且服務器返回的響應就是請求的回顯服務器(echo server)。

客戶端(cilent):

1.從控制臺讀取請求。

?2.通過網絡將請求發送給服務器。

3.從服務器讀取返回的結果。

4.將返回的結果顯示到控制臺

服務器(server):

1.接收客戶端發來的請求。

2.根據請求處理響應。

3.將響應發送回客戶端。

代碼實現

服務器編寫思路:

首先要創建一個socket文件對象(DatagramSocket),接下來就要通過網卡進行接收請求,那么就要創建一個數據報對象DatagramPacket,將網卡里的數據讀寫到數據報中,再對數據報中的進行內容進行解析。

public class Server {private DatagramSocket datagramSocket = null;public Server(int port) throws SocketException {//這里添加的port指的是服務器的端口號,源端口號和目的端口號是相對的//要指定的是空閑的端口,如果指定已經使用過的端口,就會拋出異常datagramSocket = new DatagramSocket(port);}public void start() throws IOException {//啟動服務器//1.接送客戶端請求//1.1 創建一個空的數據報DatagramPacket datagramPacket = new DatagramPacket(new byte[4069],4069);//1.2 將請求讀到一個空的數據報中,receive方法會將網卡內容讀到數據報中,當沒讀到東西時就會阻塞datagramSocket.receive(datagramPacket);//1.3 將數據報中二進制的內容轉換成字符串String request = new String(datagramPacket.getData(),0,datagramPacket.getLength());//2.根據請求處理響應String torequest = prcess(request);//3.將響應返回給客戶端//3.1 將響應構造成數據報,但是UDP是無連接,所以需要將客戶端的信息保存到數據報中DatagramPacket datagramPacket1 = new DatagramPacket(torequest.getBytes(),torequest.getBytes().length,datagramPacket.getSocketAddress());datagramSocket.send(datagramPacket1);}private String prcess(String request) {return request;}}

客戶端實現思路:

客戶端不用知道自己的端口,需要知道服務器的IP和端口。再將輸入的內容打包成一個數據報,發送給服務器,再將響應的數據報解析成字符串,最后打印。

public class Cilent {private String ServerIP;private int ServerPort;private DatagramSocket datagramSocket = null;public Cilent(String serverIP, int serverPort) throws SocketException {ServerIP = serverIP;ServerPort = serverPort;datagramSocket = new DatagramSocket();}public void start() throws IOException {Scanner scanner = new Scanner(System.in);//1. 從控制臺上讀取請求String re = scanner.next();//2. 將請求發送給服務器DatagramPacket datagramPacket = new DatagramPacket(re.getBytes(),re.getBytes().length,InetAddress.getByName(ServerIP),ServerPort);datagramSocket.send(datagramPacket);//3. 讀取服務器返回的響應DatagramPacket datagramPacket1 = new DatagramPacket(new byte[4096],4096);datagramSocket.receive(datagramPacket1);String s = new String(datagramPacket1.getData(),0,datagramPacket1.getLength());//4. 將響應顯示到控制臺System.out.println(s);}
}

客戶端和服務器代碼的區別:

1.客戶端不用知道自己的端口,操作系統會隨機分配一個空閑的端口,是因為客戶端是發送請求的一方,要知道服務器的IP和端口才能發送,而服務器只要知道自己的端口,返回響應時接收的數據報里有客戶端的信息。

?TCP協議

兩個核心的類:ServerSocket和Socket。

ServerSocket:

打開它相當于打開一個socket文件,但是它不是負責“發送”“接收”,而是建立TCP連接,這個對象是專門給服務器使用的。

Socket:

打開它相當于打開socket文件,這個類雙方都會使用,用來發送接收數據。

使用TCP協議編寫一個簡單網絡程序

客戶端:

1.用戶從控制臺輸入

2.將請求發送給服務器

3.接送服務器返回的響應

4.將響應返回到控制臺

服務器:

1.接收客戶端的請求

2.根據請求次數處理響應

3.返回響應

編寫服務器思路:TCP協議是要進行連接的,所以不可以一上來就進行讀寫數據,要先進行從內核中將連接拿取,連接后就會返回一個Socket文件,之后就是對socket文件進行處理。

要拿到Socket中的流對象進行讀寫操作,讀出數據后就要進行處理相應(這里讀數據可以用scanner從流對象中進行讀取,當讀到的數據為空時就返回跳出循環,斷開連接),處理完成后就要通過PrintWriter返回響應。

public class server {private ServerSocket serverSocket = null;public server(int port) throws IOException {this.serverSocket = new ServerSocket(port);}private void start() throws IOException {System.out.println("服務器啟動");while(true){//通過accent建立連接//ServerSocket是建立連接,Socket負責進行數據通信,后面的都是針對Socket進行數據的傳輸//Serversocket 和 Socket 之間的關系類似前者將你介紹到總部的銷售,后者是給你介紹的銷售Socket socket =  serverSocket.accept();processa(socket);}}private void processa(Socket socket) {try (InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream()){Scanner scanner = new Scanner(inputStream);PrintWriter printWriter = new PrintWriter(outputStream);while (true){//循環處理,一個客戶端可能和服務器有多輪響應//讀取并解析響應if(!scanner.hasNext()){break;}String request = scanner.next();//根據請求計算響應String response = process(request);//返回響應printWriter.print(response);}}catch (IOException e){e.printStackTrace();}}private String process(String response){return response;}
}

注意事項:一個端口被同時使用于TCP和UDP協議是不會發生沖突的。

編寫客戶端思路:

TCP是有連接,所以要一上來就進行連接,然后就是進行發送和接收,但是發送時要注意有緩沖區(buffer),發送的printin其實并沒有進行發送,而是把數據填寫到緩沖區中,這是因為CPU讀寫內存比外設要快的多,所以在讀寫入網卡時就會等緩沖區的達到一定時,才會打包發送,但是可以通過flush進行提前喚醒。

public class EcohCilent {public Socket socket = null;public EcohCilent(String serverip, int serverPort) throws IOException {//有連接,先上來要建立連接,是由操作系統進行操作的,但是我們要指定服務器的端口和ipsocket = new Socket(serverip, serverPort);}public void start() {Scanner scanner = new Scanner(System.in);System.out.println("客戶端啟動!");try (InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream()) {//接收服務器時創建的scanned,用于讀取服務器返回的內容while (true) {Scanner scanner1 = new Scanner(inputStream);PrintWriter writer = new PrintWriter(outputStream);//輸入請求System.out.println(">");String request = scanner.next();//進行打包發送到服務器writer.println(request);writer.flush();//接收返回的請求if (!scanner1.hasNext()) {System.out.println("服務器斷開連接");break;}String rerequest = scanner1.next();System.out.println(rerequest);}}catch(IOException e){e.printStackTrace();}}

注意事項:

1.在TCP客戶端中要頻繁創建Socket,可能就會導致文件資源泄漏,所以要及時關閉。而UDP中不用進行關閉是因為它不需要頻繁創建socket文件。

2.在TCP中當有多個客戶端發送請求時就會出現問題。這是因為上面的代碼有兩層循環,當進入第二層循環時會發生阻塞,這是就要通過線程的方式處理。

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

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

相關文章

【電機】定點線性映射

這是一個定點數線性映射的問題,通常用于將浮點型的物理量(如速度、位置、扭矩)轉換為嵌入式系統中使用的整型數據格式,便于通過 CAN 總線或其它通信協議發送給電機控制器。 我們來逐步解析這個過程,并以“速度”為例說…

Spring Cloud 微服務(遠程調用與熔斷機制深度解析)

📌 摘要 在微服務架構中,服務之間的遠程調用是構建分布式系統的核心環節。然而,隨著服務數量的增加和網絡復雜度的提升,調用失敗、延遲高、異常等問題變得越來越頻繁。 為此,Spring Cloud 提供了強大的遠程調用組件 …

electron-vite 抽離config.js

1、將config.js 放到resources下的config目錄下 module.exports {url: http://192.168.1.17:8000,wsUrl: ws://192.168.1.17:8000, }2、在preload.js 暴露讀取API src/preload/index.js(或你的preload入口) const fs require(fs); const path require(path);function getCo…

MySQL Undo Log 深度解析:事務回滾與MVCC的核心功臣

引言 作為MySQL的“數據后悔藥”和“歷史版本檔案館”,Undo Log(回滾日志)在事務處理和并發控制中扮演著至關重要的角色。今天咱們就從底層原理出發,結合實際場景,把Undo Log的“里里外外”說個明白! 一、…

gin如何返回html

? 方法一&#xff1a;直接返回 HTML 字符串 這種方式適合簡單場景&#xff0c;比如返回一段固定的 HTML 內容。 package mainimport "github.com/gin-gonic/gin"func main() {r : gin.Default()r.GET("/html", func(c *gin.Context) {htmlContent : <…

Insulation score算法解讀

Insulation score&#xff08;IS&#xff09;&#xff0c;俗稱絕緣分數&#xff0c;用于計算識別三維基因組中的拓撲關聯結構域TAD。 首次提出是在&#xff1a; 1&#xff0c;概念 為染色體上的基因組區間分配‘絕緣評分’的方法。該評分用于衡量跨越每個區間的所有相互作用的…

電腦系統重裝有什么用?

一、解決系統軟件問題 1、修復系統崩潰與錯誤 系統出現頻繁藍屏、死機、啟動失敗或程序運行異常&#xff08;如驅動沖突、系統文件損壞&#xff09; 2、清除惡意軟件與病毒 電腦中病毒或惡意軟件難以通過殺毒軟件徹底清除 二、優化系統性能 1、清理冗余文件與設置 長時間…

js隨機生成一個顏色

在 JavaScript 中&#xff0c;隨機生成顏色有多種方式&#xff0c;以下是最常見的幾種實現方法&#xff1a; 方法1&#xff1a;生成隨機十六進制顏色&#xff08;如 #FFFFFF&#xff09; 這是最常見的方式&#xff0c;生成格式為 #RRGGBB 的顏色字符串&#xff1a; function…

運維打鐵: 服務器防火墻策略配置與管理

文章目錄 思維導圖一、防火墻基礎1. 防火墻概念2. 常見防火墻類型3. 防火墻工作原理 二、策略配置1. 規則制定原則2. 端口與服務開放Linux 系統&#xff08;以 iptables 為例&#xff09;Windows 系統&#xff08;以 Windows 防火墻為例&#xff09; 3. IP 地址過濾允許特定 IP…

locate 命令更新機制詳解

文章目錄 **一、定時更新的實現載體&#xff1a;crontab 任務****二、定時任務的配置邏輯****三、更新觸發的額外機制****四、更新流程的性能優化****五、常見問題與解決方案****總結** 一、定時更新的實現載體&#xff1a;crontab 任務 Linux 系統通常通過 crontab 定時任務 …

docker部署nacos【單機模式使用mysql,使用.env配置】(更新:2025/7/1~)

視頻 我的個人視頻&#xff0c;有詳細步驟 使用docker部署nacos_嗶哩嗶哩_bilibili 環境 虛擬機&#xff1a;VM&#xff0c;CentOS7 遠程連接工具&#xff1a;MobaXterm 使用工具 隨機生成字符串&#xff1a; 隨機字符串生成器 | 菜鳥工具 Base64編碼&#xff1a; B…

如何安全地清除筆式驅動器

您是否正在尋找安全清除筆式驅動器的方法&#xff1f;如果是的話&#xff0c;您可以從本文中得到4個有效的解決方案。無論您準備出售還是捐贈您的筆式驅動器&#xff0c;您都可以輕松清空筆式驅動器。雖然簡單的刪除似乎就足夠了&#xff0c;但殘留的數據通常可以恢復。因此&am…

信息新技術

目錄 分布式處理基礎 一、基礎概念 二、通信與網絡 三、分布式協調與一致性 四、分布式存儲與數據庫 五、分布式計算框架 六、容錯與高可用 七、負載均衡與調度 八、安全與監控 九、常見分布式系統設計模式 十、典型系統與工具學習 區塊鏈 區塊鏈的核心技術 物聯…

創客匠人解析創始人 IP 定位:從專業度到用戶心智的占領之道

在知識付費領域&#xff0c;創始人 IP 的定位往往決定了商業變現的天花板。創客匠人通過服務 5 萬 知識博主的實踐經驗&#xff0c;揭示了一個核心邏輯&#xff1a;定位的本質不是簡單的標簽設定&#xff0c;而是通過持續提升專業度&#xff0c;以實際成果占領用戶心智。這一過…

詳解Kafka如何保證消息可靠性

Kafka 通過多個環節的精心設計和配置&#xff0c;能夠提供高可靠的消息傳遞保證&#xff0c;最大限度地減少消息丟失的可能性。這需要生產者、Broker 和消費者三方的協同配置才能實現端到端的不丟失。以下是關鍵機制&#xff1a; 一、核心原則&#xff1a;副本機制 (Replicati…

華為云Flexus+DeepSeek征文 | Word辦公軟件接入華為云ModelArts Studio大模型,實現AI智能辦公

前言 在數字化辦公時代&#xff0c;人工智能技術正深刻改變著傳統辦公軟件的使用體驗和功能邊界。將 Word 辦公軟件與華為云 ModelArts Studio 大模型進行深度融合&#xff0c;借助 AI 的強大能力實現智能化優化&#xff0c;不僅能大幅提升辦公效率&#xff0c;還能為用戶帶來…

基于開源AI大模型AI智能名片S2B2C商城小程序的流量轉化與價值沉淀研究

摘要&#xff1a;在數字化商業生態中&#xff0c;公域流量轉化已成為企業競爭的核心戰場。本文以開源AI大模型AI智能名片S2B2C商城小程序為研究對象&#xff0c;結合服裝、健康食品、快時尚等行業的實踐案例&#xff0c;系統分析其通過技術賦能實現精準獲客、用戶留存與商業閉環…

創客匠人拆解知識變現困局:創始人 IP 打造的底層邏輯與實踐路徑

在知識付費行業競爭愈發激烈的當下&#xff0c;許多內容創作者面臨 “流量增長停滯、變現效率低下” 的困境。創客匠人通過對 5 萬 知識博主的服務經驗&#xff0c;總結出創始人 IP 打造與知識變現的底層邏輯 —— 其核心在于將 “個人影響力” 轉化為 “商業閉環”&#xff0…

LabVIEW遠程面板交互控制

基于LabVIEW 遠程面板&#xff08;Remote Panel&#xff09;技術&#xff0c;實現服務器端 VI 與客戶端的遠程交互控制&#xff0c;涵蓋服務器配置、客戶端連接請求、VI 執行狀態監測及控制權交接等流程&#xff0c;支持跨 LabVIEW 實例&#xff08;可跨設備&#xff09;的遠程…

S7-1200 CPU 與 CP343-1 S7 通信(S7-1200 作為服務器)

S7-1200 CPU 與 CP343-1 S7 通信&#xff08;S7-1200 作為服務器&#xff09; S7-1200 CPU 與 CP343-1 之間的以太網通信通過 S7 通信來實現。當 CP343-1&#xff08;至少標準版&#xff09;作為客戶端&#xff0c;S7-1200 作為服務器&#xff0c;需在客戶端單邊組態連接和編程…