C#實現Socket通信:基于TCP/IP協議的網絡編程

TCP/IP網絡模型

最上層的是應用層,也就是我們日常可以接觸到的,它會給數據添加對應的頭部,并傳輸給傳輸層,應用層是我們日常會接觸到的,比如HTTP,FTP,Telnet,DNS,SMTP。HTTPS默認端口是443.

傳輸層有兩個協議:TCP和UDP,TCP常用于網絡請求等可靠性要求高的場景下,UDP的特點是速度快,但可靠性較低,常用于VPN,域名查詢的場景下。

TCP建立連接需要三次握手,客戶端發送連接請求,服務器回應請求,客戶端再次發送確認連接的請求。

客戶端 ------SYN------>服務器(SYN=1,ACK=0,此時客戶端還未連接,正發起連接請求)

客戶端 <---SYN+ACK---服務器(SYN=1,ACK=1,此時服務器收到了連接請求,同意建立連接)

客戶端 ------ACK------>服務器(SYN=0,ACK=1,連接已建立無需發送SYN去建立,只需發送ACK進行確認)

TCP斷開連接需要四次揮手,客戶端發送斷開連接的請求,服務器回應請求表示可以,之后服務器再次發送斷開連接的確認請求,客戶端確認該請求。

客戶端------FIN------>服務器(FIN=1,ACK=0,客戶端發起斷開連接的請求)

客戶端<------ACK------服務器(FIN=0,ACK=1,服務器收到請求,向客戶端確認請求,但還有部分數據未傳完暫不斷開)

客戶端<------FIN------服務器(FIN=1,ACK=1,此時服務器的數據全部傳輸完成,可以斷開連接)

客戶端------ACK------>服務器(FIN=0,ACK=1,客戶端確認收到了服務器的確認信息)

數據報文

數據報文是一次網絡傳輸的基本單位,它包含多個部分:序列號,確認號,窗口,保留位,校驗和。序列號用來打標記保證順序是正確的,因為一次請求會被拆分為多個報文,確認號是告知接收方回應的標記,做到一一對應,保留字段包括剛剛提到的ACK,FIN,SYN,校驗和是用來確認數據是否被篡改,如何無法通過校驗會被丟棄,窗口是數據傳輸的吞吐量,受限于發送方和接收方的管道大小。

什么是擁塞窗口?

這是一種網絡傳輸的過程,在初始階段通信窗口的數量是成指數性增長,當達到臨界值后,進行入擁塞避免階段開始線性增長,當增長到出現丟包的情形時傳輸數量減半,并繼續線性增長,如果接收到3次ACK請求,傳輸窗口的數量減半并加3,再進入線性增長。

網絡層最常使用的是IP協議,這一層的職責是接收傳輸層的報文,將它封裝為IP數據包,添加IP頭。

兩臺電腦通過IP地址和端口號就可以建立Socket連接,一臺電腦最多可以擁有2 ^ 16個端口。

通過在控制臺中輸入netstat -nao獲取電腦的TCP和UDP連接,已經對應的PID。

Socket通信

Socket位于哪一層?

在 OSI 模型中,Socket 通常被認為是傳輸層的一部分,因為它直接與傳輸層協議(如 TCP 或 UDP)交互。

但從功能上看,Socket 更像是傳輸層和應用層之間的橋梁,因為它為應用層提供了訪問傳輸層服務的接口。

如何用C#實現Socket通信?

這里需要用到一個第三方的類庫TouchSocket,它比微軟原生的Socket通信庫多了很多功能,像是斷點重連, 健康活性檢驗等等。

1、首先在Nuget上下載最新版的TouchSocket 3.1.1

2、創建一個TcpClient服務,進行事件綁定,配置插件,在Received事件中可以獲取到服務器的反饋,發送數據通過Send方法

    // TCP客戶端var _tcpClient = new TcpClient();#region 事件綁定_tcpClient.Connected = (client, e) =>{this.Invoke(new Action(() =>{this.richTextBoxMsgLog.AppendText($"連接到服務器".StringFormatLog() + Environment.NewLine);}));// 改變UI狀態this._isOpen = true;this.Invoke(new Action(() => {this.btnOpen.Text = "斷開連接";this.SwitchCheckBoxForSetting(false);}));return EasyTask.CompletedTask;};_tcpClient.Closed = (client, e) =>{this.Invoke(new Action(() =>{this.richTextBoxMsgLog.AppendText($"斷開與服務器的連接".StringFormatLog() + Environment.NewLine);}));// 斷開網絡this._tcpClient.Close();this._isOpen = false;this.Invoke(new Action(() => {this.btnOpen.Text = "連接";this.SwitchCheckBoxForSetting(true);}));return EasyTask.CompletedTask;};_tcpClient.Received = (client, e) =>{string mes = e.ByteBlock.Span.ToString(Encoding.UTF8);this.Invoke(new Action(() =>{this.richTextBoxMsgLog.AppendText($"從服務器收到信息:{mes}".StringFormatLog() + Environment.NewLine);}));return EasyTask.CompletedTask;};#endregion// 配置斷開重連機制var config = new TouchSocketConfig();config.ConfigurePlugins(plugins =>{// 自動重連plugins.UseTcpReconnection().UsePolling(TimeSpan.FromSeconds(1));});// 連接服務器await this._tcpClient.SetupAsync(config);await _tcpClient.ConnectAsync($"{ip}:{port}");

3、創建一個TcpServer服務,用于接收客戶端發送的消息,代碼和客戶端的差不多。

    TcpService _service = new TcpService();// 創建一個TCP服務器_service.Connecting = (client, e) =>{return EasyTask.CompletedTask;};_service.Connected = (client, e) =>{this.Invoke(new Action(() =>{this.richTextBoxMsgLog.AppendText($"有客戶端連接:{client.IP}:{client.Port}".StringFormatLog() + Environment.NewLine);}));return EasyTask.CompletedTask;};_service.Closing = (client, e) =>{return EasyTask.CompletedTask;};_service.Closed = (client, e) =>{this.Invoke(new Action(() =>{this.richTextBoxMsgLog.AppendText($"有客戶端斷開連接:{client.IP}:{client.Port}".StringFormatLog() + Environment.NewLine);}));return EasyTask.CompletedTask;};_service.Received = (client, e) =>{//從客戶端收到信息var mes = e.ByteBlock.Span.ToString(Encoding.UTF8);this.Invoke(new Action(() =>{this.richTextBoxMsgLog.AppendText($"客戶端:{client.IP}:{client.Port},發送消息:{mes}".StringFormatLog() + Environment.NewLine);}));return EasyTask.CompletedTask;};var config = new TouchSocketConfig();config.ConfigurePlugins(plugins =>{// 健康活性檢驗插件(CheckClearPlugin)用于檢測當前連接是否有正常的數據交流,如果沒有,則主動斷開連接。plugins.UseCheckClear().SetCheckClearType(CheckClearType.All).SetTick(TimeSpan.FromSeconds(60)).SetOnClose(async (c, t) =>{await c.ShutdownAsync(System.Net.Sockets.SocketShutdown.Both);await c.CloseAsync("超時無數據");});});await this._service.SetupAsync(config);await this._service.StartAsync($"{ip}:{port}");

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

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

相關文章

哈希算法、搜索算法與二分查找算法在 C# 中的實現與應用

在計算機科學中&#xff0c;哈希算法、搜索算法和二分查找算法是三個非常基礎且常用的概念。它們分別在數據存儲、數據查找、以及高效檢索等場景中起著至關重要的作用。在 C# 中&#xff0c;這些算法的實現和使用也十分簡便。本文將詳細講解這三種算法的原理、應用以及 C# 中的…

AI日報 · 2025年5月05日|雅詩蘭黛與微軟合作成立 AI 創新實驗室,加速美妝產品研發與營銷

1、蘋果與 Anthropic 深化合作&#xff0c;內部測試 AI 驅動的新版 Xcode 據多方報道&#xff0c;蘋果公司正與人工智能初創公司 Anthropic 合作&#xff0c;開發集成 AI 功能的新一代 Xcode 開發平臺。該平臺旨在利用 Anthropic 強大的 Claude Sonnet 模型&#xff0c;為開發…

python celery框架結合django的使用

學習目標&#xff1a; 通過文章了解celery的運行機制以及如何結合django去使用 熟悉celery的運行原理屬性celery在django項目當中的配置如何啟動運行celery框架 學習內容&#xff1a; 熟悉celery的運行原理&#xff0c;簡單來說 Celery 是一個“任務排隊機后臺處理器”。幫你…

滑動窗口leetcode 904

代碼&#xff1a; class Solution { public:int totalFruit(vector<int>& fruits) {int n fruits.size();unordered_map<int,int> window_type_count;int left 0;int ans 0;for(int right 0; right <n;right){while(window_type_count.size() 2 &&…

用可視化學習逆置法

1.逆置法思路 目標&#xff1a;將這個彩色數組向右旋轉3步 &#x1f534;1 → &#x1f7e0;2 → &#x1f7e1;3 → &#x1f7e2;4 → &#x1f535;5 → &#x1f7e3;6 → ?7我們希望得到 &#x1f535;5 → &#x1f7e3;6 → ?7 → &#x1f534;1 → &#x1f7e0;…

Cisco Packet Tracer 選項卡的使用

目錄 設備Config選項卡的使用 Realtime and Simulation模式&#xff08;數據包跟蹤與分析&#xff09; 設備Desktop選項卡的使用 設備Config選項卡的使用 Hostname NVRAM Startup Config----Load 加載 INTERFACE 點擊on Save 如果&#xff0c;不把Running Config保存為Sta…

pyqt寫一個單片機配置界面

已經實現以下功能 1.可以選擇單片機架構 2.選擇完單片機架構后第二個框可以選擇常見單片機型號 3.選擇完常見單片機型號后第三個框可以選擇內部資源如adc等&#xff08;可以選擇多個內部資源&#xff09;4.選擇完內部資源如adc等&#xff08;可以選擇多個內部資源&#xff09;后…

丟失的數字 --- 位運算

目錄 一&#xff1a;題目 二&#xff1a;算法原理 三&#xff1a;代碼實現 一&#xff1a;題目 題目鏈接&#xff1a; 268. 丟失的數字 - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理 三&#xff1a;代碼實現 class Solution { public:int missingNumb…

千鋒教育Ansible自動化運維實戰教程從入門到精通

簡介 介紹 Ansible 的基本概念、自動化運維優勢、應用場景及課程目標。 歡迎開啟 Ansible 學習之旅&#xff01; 你好&#xff01;作為一名學習者&#xff0c;你即將通過這個 Ansible 自動化運維實戰 課程&#xff0c;從零開始掌握自動化運維的超能力&#xff01;這個“簡介”…

深入理解 TensorFlow 的模型保存與加載機制(SavedModel vs H5)

深入理解 TensorFlow 的模型保存與加載機制&#xff08;SavedModel vs H5&#xff09; 在使用 TensorFlow 進行模型訓練后&#xff0c;模型的保存與加載是部署、復用和遷移學習的重要環節。TensorFlow 提供了兩種主要的保存格式&#xff1a;SavedModel 和 HDF5 (.h5)。本篇文章…

C++之特殊類設計及類型轉換

目錄 一、設計一個不能被拷貝的類 二、設計一個只能在堆上創建對象的類 三、設計一個只能在棧上創建對象的類 四、設計一個不能被繼承的類 五、設計一個只能創建一個對象的類(單例模式) 六、C語言中的類型轉換 七、C中的三類類型轉換 八、C強制類型轉換 8.1、為什么C需…

制作一款打飛機游戲36:調度編輯器

我們正在創建一個調度編輯器。嗯&#xff0c;這個名字聽起來可能有點奇怪&#xff0c;對吧&#xff1f;但如果你了解射擊游戲中的“調度”&#xff0c;那就是敵人出現的時間表。 你可能已經看到了&#xff0c;我們有一個可以滾動的關卡。現在&#xff0c;我想增加一些交互性&a…

wordperss AI插件:AI圖文+視頻+長尾關鍵詞自動生成,已內置deepseek、kimi全模型,支持簡單一鍵接入更多自定義API

【2.17最新版】Linkreate wordperss AI插件&#xff1a;AI圖文視頻長尾關鍵詞自動生成&#xff0c;已內置deepseek、kimi全模型。 支持自定義接入其它API&#xff0c;包括但不限于騰訊云API和它的deepseek模型 后臺只需要設置對應的API url 、模型 、API key,就可以讓插件調用…

從零開始學Python:開啟編程新世界的大門

在當今數字化時代&#xff0c;Python作為一門簡潔、高效且功能強大的編程語言&#xff0c;受到了越來越多人的喜愛與追捧。無論是數據科學、人工智能、Web開發&#xff0c;還是自動化腳本編寫&#xff0c;Python都展現出了卓越的能力。本文將帶領大家踏上Python學習之旅&#x…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】3.2 缺失值檢測與處理(NULL值填充/刪除策略)

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 缺失值檢測與處理全攻略&#xff1a;NULL值填充與刪除策略實戰3.2 缺失值檢測與處理3.2.1 缺失值類型與業務影響3.2.1.1 缺失值的三種形態3.2.1.2 業務影響分級 3.2.2 缺失值…

Java求職面試:Spring Boot與微服務的幽默探討

Java求職者面試&#xff1a;技術與幽默的碰撞 場景概述 在某互聯網大廠的面試現場&#xff0c;面試官嚴肅認真&#xff0c;程序員則是一個搞笑的水貨角色。面試者名叫張偉&#xff0c;年齡28歲&#xff0c;碩士學歷&#xff0c;擁有5年的Java開發經驗。以下是面試的詳細過程。…

使用 NGINX 實現 HTTP Basic 認證ngx_http_auth_basic_module 模塊

一、前言 在 Web 應用中&#xff0c;對部分資源進行訪問控制是十分常見的需求。除了基于 IP 限制、JWT 驗證、子請求校驗等方式外&#xff0c;最經典也最簡單的一種方式便是 HTTP Basic Authentication。NGINX 提供的 ngx_http_auth_basic_module 模塊支持基于用戶名和密碼的基…

map和set的設計以及紅黑樹的設計

1.map和set的底層是紅黑樹 2.map和set在STL是容器&#xff0c;在我看來&#xff0c;不過也是封裝了平衡二叉搜索樹紅黑樹的適配器 我們先看紅黑樹的設計&#xff0c;看完后map和set的封裝易如反掌 #pragma once #include<utility> #include<iostream> using name…

Linux運維——Vim技巧二

Vim技巧 一、管理多個文件1.1、用緩沖區列表管理打開的文件1.2、用參數列表將緩沖區分組1.3、將工作區切分成窗口1.4、用標簽頁將窗口分組1.5、用:edit命令打開文件1.6、使用:find打開文件1.7、把文件保存到不存在的目錄中 二、動作命令在文檔中移動2.1、區分實際行與屏幕行2.2…

2025 年 408 真題及答案

2025 年 408 真題 歷年408真題及答案下載直通車 1、以下 C 代碼的時間復雜度是多少&#xff1f;&#xff08;&#xff09; int count 0; for (int i0; i*i<n; i)for (int j0; j<i; j)count;A O(log2n)B O(n)C O(nlogn)D O(n2) 2、對于括號匹配問題&#xff0c;符號棧…