網絡編程-java

Socket 套接字
Socket套接字,是由系統提供用于網絡通信的技術,是基于 TCP/IP 協議的網絡通信的基本單元。基于 Socket 套接字的網絡程序開發就是網絡編程。
應用層會調用操作系統提供的一組 api ,這組 api 就是 socket api(傳輸層給應用層提供)
socket => 插槽 -> 主板上的一些接口

傳輸層有兩個核心協議:
TCP UDP 由于這兩個協議差別非常大,編寫代碼的時候,也是不同的風格。所以,socket api 提供了兩套~
TCP的特點:有鏈接 , 可靠傳輸 ,面向字節流 , 全雙工
UDP的特點:無連接 ,不可靠傳輸 , 面向數據報 , 全雙工

有鏈接/無連接:
有鏈接/無連接 是抽象的概念,虛擬的/邏輯上的鏈接。
要進行網絡通信,物理上的鏈接(網線什么的)
對于 TCP 來說,TCP 協議中,就保存了對端的信息(A和B 通信,A和B先建立鏈接,讓A保存B的信息,B保存A的信息(彼此之間知道,誰是和它建立連接的那個))
對于 UDP 來說, UDP 協議本身,不保存對方的信息 ——就是無連接 (當然可以在自己的代碼中寫變量,保存對方的信息,但這不是 UDP 的行為)

可靠傳輸 VS 不可靠傳輸
網絡上,數據是非常容易出現丟失的情況(丟包)。像光信號/電信號,都可能受到外界的干擾。(比如本來是傳輸 0101,其中有些 bit 為就被修改了,這樣亂了的數據就會被識別出來,把這樣的數據給丟掉)
并且網絡世界 是通過路由器/交換機交織起來了,路由器/交換機就類似于“十字路口”,因此就會發生“堵車”,在某個時間點,實際需要轉發的數據超過了設備轉發的上限。
所以,我們不能指望,一個數據包發送之后,100%到達對方。
可靠傳輸的意思,不是保證數據包100%到達,而是盡可能的提高傳輸成功的概率,如果出現丟包了,是能夠感知到的。
不可傳輸的意思,只是把數據發了,就不管了。
可能我們只管感覺,可靠傳輸更好,但是可靠傳輸也是要付出代價的 —— 他的效率是遠不如不可靠傳輸的。所以也是要分情況使用的。

面向字節流 VS 面向數據報
面向字節流,讀寫數據的時候,是以字節為單位 => 支持任意長度,但會導致粘包問題。
面向數據報,讀寫數據的時候,是以一個數據報為單位(不是字符) => 一次必須讀寫一個 UDP 數據報,不能是半個,所以不存在粘包,但長度受到限制

全雙工 VS 半雙工
全雙工:一個通信鏈路,支持 雙向通信 (類似能讀,也能寫)
半雙工: 一個通信鏈路,只支持單向通信(要么讀,要么寫)

計算機中的“文件”通常是一個“廣義的概念”,文件還能代指一些硬件設備(操作系統管理硬件設備,也是抽象成文件,統一管理的)。
網卡 => socket文件
操作網卡的時候,流程和操作普通文件差不多,也是 打開(也會在文件描述符表中分配一個表項) -> 讀寫 -> 關閉
操作網卡,直接操作不好操作,所以就把網卡轉換成操作 socket 文件,socket 文件就相當于“網卡的遙控器”。
那么接下來我們就要進行 socket api 進行網絡編程了,本身也是操作系統的功能。

UDP數據報套接字編程
API介紹
DatagramSocket
DatagramSocket 是 UDP Socket,用與發送和接收UDP數據報。
DatagramSocket的構造方法:(相當于打開文件)
在這里插入圖片描述

port:端口號
創建Socket的時候,就會關聯上一個 端口號,使用端口號來區分主機上不同的應用程序。

DatagramSocket的一些關鍵方法:
在這里插入圖片描述

DatagramPacket
DatagramPacket 是UDP Socket 發送和接受的數據報。
DatagramPacket的構造方法:
在這里插入圖片描述

DatagramPacket的關鍵方法:
在這里插入圖片描述

構造UDP發送的數據報時,需要傳入 SocketAddress,該對象可以使用 InetSocketAddress 來創建。

下來我們來創建一個回顯服務器和客戶端(簡易):
在這里插入圖片描述

Echo:回聲
回顯服務器:客戶端給服務器發一個數據(請求),服務器返回一個數據(響應),請求是什么,響應就是什么。
不過真實的服務器,請求和響應是不一樣的。

回顯服務器,處理請求的關鍵步驟:

  • 1.接收請求并解析
  • 2.根據請求,計算響應(最關鍵的步驟)
  • 3.發送響應給客戶端
  • 4.創建日志
    在這里插入圖片描述
    在這里插入圖片描述

此處有一個問題是 socket 不用close 嗎?
文件要關閉,要考慮清除這個文件對象的生命周期是怎么樣的,此處的 socket 對象,伴隨整個 Udp 服務器,自始至終。
如果服務器關閉(進程結束),進程結束時就會自動釋放PCB的文件描述表中的所有資源,也不需要手動調用 close 了。
還有一個問題:當前服務器啟動之后,客戶端還沒有,當然也沒有請求發送,那么在客戶端請求過來之前, 服務器里面的邏輯都在干什么呢?
在這里插入圖片描述

receive 會觸發阻塞行為。客戶端請求發來了,receive 才會返回,客戶端的請求沒來,receive 就一直阻塞了。

創建客戶端的重要步驟:

  • 1.從控制臺讀取用戶輸入的信息
  • 2.將請求發送給服務器
  • 3.接收服務器的響應
  • 4.從服務器讀取的數據進行解析,并打印
    不過有一個不同的是,客戶端的構造方法需要指定訪問的服務器的地址和端口號
    在這里插入圖片描述
    在這里插入圖片描述

在此基礎上,我們可以編寫一個漢譯英服務器。
在這里插入圖片描述

我們只需要重寫 process 方法。
在這里插入圖片描述

TCP套接字編程
TCP的一個核心特點,面向字節流。讀寫數據的基本單位就是字節byte。
API介紹
ServerSocket:
ServerSocket是創建 TCP服務端Socket 的API。(專門給服務端用的)
構造方法:
在這里插入圖片描述

服務器啟動,需要先綁定一個端口號。

關鍵方法:
在這里插入圖片描述

TCP是“有連接”,這里的 accept 聯通連接的關鍵操作。

Socket:
Socket 是客戶端Socket,或服務器中接收到客戶端建立連接(accept方法)的請求后,返回的服務端Socket。
不管是客戶端還是服務端Socket,都是雙方建立連接以后,保存的對端信息,以及用來與對方收發數據的。
構造方法:
在這里插入圖片描述

host 和 port 是服務器的 IP 和服務器的 端口,不是客戶端自己的。

關鍵方法:(注意返回值)
在這里插入圖片描述

那接下來我們就通過 TCP 來實現回顯服務器和客戶端的簡單通信吧~~
大致思路是一樣的,但還是有一些不同的。

服務器:
在這里插入圖片描述

客戶端:
在這里插入圖片描述

這里面的 Scanner 和 PrintWriter 是針對 InputStream 和 OutputStream 套了一層。上述,我們其實已經完成輸入輸出?作,但總是有所不?便,所以將InputStream 和 OutputStream 處理下,使?Scanner 和 PrintWriter 類來完成輸入輸出,因為PrintWriter 類中提供了我們熟悉的 print/println/printf ?法。

Scanner 這里的構造方法:
在這里插入圖片描述

PrintWriter這里的構造方法:
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

上述代碼是我們根據 UDP 的思路來寫出來的。雖然看起來沒啥問題,但是運行的時候,我們會發現,雖然服務器日志這邊顯示出來客戶端已經建立連接了,但是在客戶端發送請求之后,沒有響應答打印出來。這是為什么呢?
在這里插入圖片描述
在這里插入圖片描述

這是因為這個println方法只是把數據放到“發送緩沖區(內存空間)”中,還沒有真正寫入到網卡中。
在這里插入圖片描述
在這里插入圖片描述

解決辦法就是 使用 flush 方法來“沖刷緩沖區”。這是PrintWriter 的行為,如果不套殼,是可以直接發送的,但是在實際開發中,廣泛使用緩沖區這樣的概念,flush 這個操作是很關鍵的。
在這里插入圖片描述

加了flush就可以了。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

但是還有一個問題是,一個服務器可能要同時給多個客戶端提供服務,在服務器建立連接的代碼上我們寫了個while循環,代表的意思是可以建立多個連接。在IDEA上面默認的是一個程序只能啟動一邊,再次啟動還是該程序。通過設置,我們可以連續創建多個客戶端。
在這里插入圖片描述

通過在不同的客戶端發送請求,我們會發現只有第一個客戶端的請求能得到響應,但是其他的客戶端沒有得到響應。
在這里插入圖片描述

但是,把當前得到響應的客戶端關閉之后,下一個客戶端就會得到響應了,這是為什么呢?
在這里插入圖片描述

在服務器中
在這里插入圖片描述

如果只是單個線程,無法同時響應多個客戶端。此處應該給每個客戶端都分配一個線程,所以多線程的誕生,就是為了這個場景服務的。
在這里插入圖片描述
在這里插入圖片描述

除了引入多線程之外,為了避免頻繁創建銷毀線程,也可以引入線程池。
在這里插入圖片描述

如果客戶端進一步增加,此時多線程/線程池,就會產生出大量的線程。操作系統中內置了IO多路復用,其本質上是一個線程同時負責多個客戶端的請求。

舉個例子:
比如我和朋友要去小吃街吃飯,他想吃煎餅果子,我想吃肉夾饃。此時有三個方案:
方案一:
我先買煎餅果子,再去買肉夾饃。(單線程)
方案二:
我和朋友一起出發,他買煎餅果子,我買肉夾饃。(多線程)
方案三:
我先到煎餅果子這邊,給老板說:“老板,來個煎餅果子,我一會過來拿”,然后又到肉夾饃那邊,給老板說:“老板來個肉夾饃,我一會過來拿”,然后我就開始等,在這等的過程中,這兩個小攤的老板在同時工作。等他們做好的時候,就會過來叫我。所以我只是用了一份等待的時間,同時等待兩個任務的完成。
(IO多路復用)

多個客戶端,對應著多個老板,每個客戶端,絕大部分時間是沉默的,工作線程只需要等待,等到客戶端發來數據的時候,線程再來處理就可以了,多個客戶端同時發數據的概率比較小。
IO多路復用是當前開發服務器的主流的核心技術,操作系統內置的,只需要調用api即可,Java 通過 NIO 來封裝了 IO 多路復用。

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

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

相關文章

CPU架構、三級緩存以及內存優化屏障

目錄 一、三級緩存和內存布局 二、CPU架構 (1)SMP對稱對處理器架構 (2)NUMA非統一內存架構 三、RCU機制在內核中的體現 四、內存優化屏障 (1)編譯器、CPU優化 (2)優化的問題…

HarmonyOS從入門到精通:動畫設計與實現之九 - 實用動畫案例詳解(下)

HarmonyOS動畫開發實戰(九):實用動畫案例詳解(下) 在上篇中,我們圍繞加載動畫、點贊反饋、下拉刷新等核心交互場景,探討了如何通過動畫提升用戶體驗。本篇將聚焦界面元素動效與特殊場景動畫&…

Node.js 聊天內容加密解密實戰教程(含緩存密鑰優化)

一、技術方案說明 本方案采用以下技術組合: 加密算法:AES-256-GCM(認證加密,防止篡改)密鑰派生:PBKDF2(10萬次迭代)緩存機制:內存緩存 定期輪換安全特性:隨機…

信息安全基礎專業面試知識點(上:密碼學與軟件安全)

密碼學DES加密流程56比特長度的密鑰K, 分組長度64比特,密文64比特初始置換 (IP):將輸入的64位明文塊進行置換,打亂其順序。分成左右兩半: 將置換后的64位數據分成左右兩部分,每部分32位。16輪迭代加密: 這是DES的核心&#xff0c…

Windows Server 2025 黃金dMSA攻擊漏洞:跨域攻擊與持久化訪問風險分析

網絡安全研究人員近日披露了Windows Server 2025中委托管理服務賬戶(dMSA,Delegated Managed Service Accounts)存在的"關鍵設計缺陷"。據Semperis公司向The Hacker News提供的報告顯示:"該漏洞可能導致高危害攻擊…

解鎖數據分析:從基礎概念到核心指標的全面指南

在數字化時代,數據已成為驅動業務決策的核心力量。無論是運營一款 APP、管理一家便利店,還是優化在線教育課程,理解數據的本質與關鍵指標都至關重要。本文將從數據的基本概念出發,拆解運營全流程中的核心指標,并分享數…

DiffPy-CMI詳細安裝教程

本章教程,主要記錄安裝DiffPy-CMI的具體安裝步驟。 DiffPy-CMI 是一個復雜建模框架,是高度靈活的 Python 模塊庫,專為晶體、納米材料及非晶態材料的納米結構建模而設計。 注意:DiffPy-CMI只支持在Linux和Mac上安裝,Windows上是不支持的。 一、準備工作 需要準備一臺Linux或…

中國各省市縣坡度數據(Tif/Excel)

數據簡介 昨天我們分享了中國120m精度的DEM數據(見前文),今天我們根據該數據計算中國的坡度數據,并根據中國省市縣行政區劃數據將其統計各省市縣坡度的最大、最小以及平均值,方便大家研究使用。 基于中國120米精度DEM生成的坡度數據&#xff…

09-three.js Materials

Three.js Journey — Learn WebGL with Three.jsThe ultimate Three.js course whether you are a beginner or a more advanced developerhttps://threejs-journey.com/?cp3 MeshBasicMaterial 添加3個網格體: /*** Object*/ // MashBasicMaterial const mater…

Netty介紹和基本代碼演示

什么是Netty?Netty是一個基于Java NIO的異步事件驅動的網絡應用框架,主要用于快速開發高性能、高可靠性的網絡服務器和客戶端程序。它簡化了網絡編程的復雜性,提供了豐富的協議支持,被廣泛應用于各種高性能網絡應用中。為什么選擇…

[BrowserOS] Nxtscape瀏覽器核心 | 瀏覽器狀態管理 | 瀏覽器交互層

第三章:Nxtscape瀏覽器核心 歡迎回來! 在前兩章中,我們了解了名為專用AI代理的專家團隊及其管理者AI代理協調器,它們協同解析需求并規劃執行步驟。 但這些代理與協調器實際運行的平臺是什么?答案正是本章的核心——…

時序數據庫處理的時序數據獨特特性解析

時序數據(Time-Series Data)作為大數據時代增長最快的數據類型之一,正在物聯網、金融科技、工業監控等領域產生爆炸式增長。與傳統數據相比,時序數據具有一系列獨特特性,這些特性直接影響了時序數據庫(Time…

uniapp各端通過webview實現互相通信

目前網上,包括官方文檔針對uniapp的webview的內容都是基于vue2的,此文章基于vue3的composition API方式網頁對網頁 由于uniapp中的webview只支持引入h5頁面,不支持互相通信,所以要條件編譯,用iframe導入頁面&#xf…

【Vue】tailwindcss + ant-design-vue + vue-cropper 圖片裁剪功能(解決遇到的坑)

1.安裝 vue-cropper pnpm add vue-cropper1.1.12.使用 vue-cropper <template><div class"user-info-head" click"editCropper()"><img :src"options.img" title"點擊上傳頭像" class"img-circle" /><…

【Java】【力扣】101.對稱二叉樹

思路遞歸大問題&#xff1a;對比 左 右 是否對稱參數 左和右todo 先湊合看代碼/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* …

前端 oidc-client 靜默刷新一直提示:Error: Frame window timed out 問題分析與解決方案

引言 在現代前端開發中&#xff0c;OAuth 2.0 和 OpenID Connect (OIDC) 協議已成為身份驗證和授權的標準解決方案。oidc-client-js 是一個流行的 JavaScript 庫&#xff0c;用于在前端應用中實現 OIDC 協議。其中&#xff0c;靜默刷新&#xff08;Silent Renew&#xff09;是一…

DAY02:【ML 第一彈】KNN算法

一、算法簡介 1.1 算法思想 如果一個樣本在特征空間中的 k 個最相似的樣本中的大多數屬于某一個類別&#xff0c;則該樣本也屬于這個類別。 1.2 樣本相似性 樣本都是屬于一個任務數據集的&#xff0c;樣本距離越近則越相似。 二維平面上點的歐氏距離 二維平面上點 a(x1,y1)a(x_…

wpf 實現窗口點擊關閉按鈕時 ??隱藏?? 而不是真正關閉,并且只有當 ??父窗口關閉時才真正退出?? 、父子窗口順序控制與資源安全釋放?

文章目錄實現方法**方法 &#xff1a;重寫 OnClosing 方法****子窗口&#xff08;SettingView&#xff09;代碼****父窗口&#xff08;MainWindow&#xff09;代碼****關鍵點****適用場景**為什么if (Owner null || !Owner.IsLoaded)能夠判斷父窗口已經關閉**1. Owner null 檢…

硬件設計學習DAY4——電源完整性設計:從概念到實戰

每日更新教程&#xff0c;評論區答疑解惑&#xff0c;小白也能變大神&#xff01;" 目錄 一.電源完整性 1.1電源完整性的核心概念 1.2電源完整性的三個關鍵目標 1.3地彈現象的通俗解釋 1.4總結要點 二.電源分配網絡&#xff08;PDN&#xff09;的作用 電源與GND網絡…

QT跨平臺應用程序開發框架(8)—— 多元素控件

目錄 一&#xff0c;關于多元素控件 二&#xff0c;QListWidget 2.1 主要方法 2.2 實現新增刪除 三&#xff0c;Table Widget 3.1 主要方法 3.2 代碼演示 四&#xff0c;Tree Widget 4.1 主要方法 4.2 代碼演示 一&#xff0c;關于多元素控件 多元素控件就是一個控件里面包含了…