基于C#的以太網通訊實現:TcpClient異步通訊詳解

基于C#的以太網通訊實現:TcpClient異步通訊詳解
在現代工業控制和物聯網應用中,以太網通訊是一種常見的數據傳輸方式。本文將介紹如何使用C#實現基于TCP協議的以太網通訊,并通過異步編程提高通訊效率。我們將使用TcpClient類來實現客戶端與服務器的連接、數據發送和接收,并詳細講解關鍵技術點。

1. 概述

以太網通訊基于TCP/IP協議,是一種可靠的、面向連接的通訊方式。在C#中,System.Net.Sockets.TcpClient類提供了對TCP協議的支持,可以方便地實現客戶端與服務器之間的通訊。本文將使用異步編程模型(APM)來處理連接、發送和接收數據,以提高程序的響應性和性能。

2. 關鍵技術點

2.1 TcpClient類

TcpClient是C#中用于實現TCP客戶端通訊的核心類。它封裝了底層的Socket操作,提供了簡單易用的接口。

2.2 數據緩沖區

在通訊過程中,數據通過字節數組(byte[])進行傳輸。合理設置緩沖區大小可以提高數據傳輸效率。

2.3 連接超時處理

在網絡通訊中,連接超時是一個常見問題。通過設置超時時間,可以避免程序長時間等待無響應的服務器。

3. 代碼實現

以下是基于TcpClient的異步通訊實現代碼,關鍵技術點已標識。

3.1 TcpClientAsyncTool類

    public class TcpClientAsyncTool{TcpClient tcpClient;public bool isConnected = false;IPAddress iPAddress;int port;int connectTimeout;byte[] receiveBuffer = new byte[1024];public TcpClientAsyncTool(string ip, int port, int connectTimeout = 2000){tcpClient = new TcpClient();this.iPAddress = IPAddress.Parse(ip);this.port = port;this.connectTimeout = connectTimeout;}/// <summary>/// 連接服務器/// </summary>/// <param name="errorMsg"></param>/// <returns></returns>public bool Connect(Action connectDelegate, out string errorMsg){bool result = false;errorMsg = string.Empty;try{IAsyncResult asyncResult = tcpClient.BeginConnect(iPAddress, port, null, null);connectDelegate();bool success = asyncResult.AsyncWaitHandle.WaitOne(TimeSpan.FromMilliseconds(connectTimeout));//設置連接超時時間為2秒tcpClient.EndConnect(asyncResult);result = true;isConnected = result;}catch (Exception ex){errorMsg = ex.Message;}return result;}/// <summary>/// 斷開連接/// </summary>/// <param name="errorMsg"></param>/// <returns></returns>public bool DisConnect(out string errorMsg){bool result = false;errorMsg = string.Empty;try{tcpClient.Close();isConnected = result;}catch (Exception ex){errorMsg = ex.Message;}return result;}/// <summary>/// 發送數據/// </summary>/// <param name="bytes"></param>/// <param name="errorMsg"></param>/// <returns></returns>public bool SendData(byte[] sendBytes, out string errorMsg){bool result = false;errorMsg = string.Empty;try{NetworkStream networkStream = tcpClient.GetStream();IAsyncResult asyncResult = networkStream.BeginWrite(sendBytes, 0, sendBytes.Length, null, null);networkStream.EndWrite(asyncResult);result = true;}catch (Exception ex){errorMsg = ex.Message + ex.StackTrace;}return result;}/// <summary>/// 接收數據/// </summary>/// <param name="result"></param>/// <param name="errorMsg"></param>/// <returns></returns>public byte[] ReceiveData(out bool result, out string errorMsg){result = false;errorMsg = string.Empty;byte[] readByteArray = null;try{NetworkStream networkStream = tcpClient.GetStream();IAsyncResult iAsyncResult = networkStream.BeginRead(receiveBuffer, 0, receiveBuffer.Length, null, null);int readBytes = networkStream.EndRead(iAsyncResult);readByteArray = new byte[readBytes];Array.Copy(receiveBuffer, readByteArray, readBytes);result = true;}catch (Exception ex){errorMsg = ex.Message + ex.StackTrace;}return readByteArray;}}

3.2 使用示例

以下是使用TcpClientAsyncTool類的示例代碼,展示了如何連接服務器、發送和接收數據。

3.2.1 socket連接,端口號10010

    tcpClient1 = new TcpConnect.TcpClientAsyncTool(controlBoxWithID1.IP, 10010); // 初始化TcpClienttasks.Add(Task.Run(async () =>{if (tcpClient1.Connect(action, out errorMsg)) // 連接服務器{isConnected1 = true;await Task.Run(new Action(ReaceiveData)); // 啟動數據接收任務}}));

3.2.2 數據接收

提前聲明:TcpConnect.TcpClientAsyncTool tcpClient1; TcpClient客戶端1

private void ReaceiveData()
{while (true){try{bool result = false;string errorMsg = string.Empty;byte[] readReadBytes = tcpClient1.ReceiveData(out result, out errorMsg); // 接收數據if (readReadBytes != null){//處理接收數據信息readReadBytes }}catch (Exception ex){Console.WriteLine($"Failed to connect to power supply: {ex.Message}"); // 捕獲異常并輸出錯誤信息}if (isConnected1 == false){break; // 如果連接斷開,退出循環}}
}

3.2.2 數據發送

        public void SendData1(byte[] message){string errorMsg = string.Empty;if (isConnected1){tcpClient1.SendData(message, out errorMsg);}}

4. 關鍵技術解析

4.1 異步連接

通過BeginConnect和EndConnect方法實現異步連接,避免了主線程阻塞。使用AsyncWaitHandle.WaitOne設置超時時間,防止連接無響應的服務器。

4.2 異步發送和接收數據

使用BeginWrite/EndWrite和BeginRead/EndRead實現異步數據發送和接收,確保通訊過程不會阻塞主線程。

4.3 數據緩沖區

通過byte[]數組作為數據緩沖區,接收到的數據會被存儲在該數組中。合理設置緩沖區大小可以提高數據傳輸效率。

4.4 連接狀態管理
通過isConnected變量管理連接狀態,確保在連接斷開時及時停止數據接收任務。

5. 總結

本文介紹了如何使用C#實現基于TCP協議的以太網通訊,并通過異步編程模型提高了通訊效率。關鍵技術點包括TcpClient的使用、異步編程模型、數據緩沖區和連接超時處理。通過本文的代碼示例,您可以快速實現一個可靠的以太網通訊客戶端。

希望這篇文章對您有所幫助!如果有任何問題,歡迎在評論區留言討論。

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

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

相關文章

小秋的矩陣

0小秋的矩陣 - 藍橋云課 問題描述 給你一個 n 行 m 列只包含 0 和 1 的矩陣&#xff0c;求它的所有子矩陣中&#xff0c;是方陣而且恰好包含 k 個 0 的數量。 方陣是行數和列數相等的矩陣。 子矩陣是從一個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣&#xff08;保…

晶晨S905L3芯片_原機安卓4升級安卓9.0_通刷線刷固件包

晶晨S905L3芯片_原機安卓4升級安卓9.0_通刷線刷固件包 線刷方法&#xff1a;&#xff08;新手參考借鑒一下&#xff09; 1、準備好一根雙公頭USB線刷刷機線&#xff0c;長度30-50CM長度最佳&#xff0c;同時準備一臺電腦&#xff1b; 2、電腦上安裝好刷機工具Amlogic USB Bu…

麒麟服務器操作系統Redis部署手冊

軟件簡介 Redis****介紹 REmote DIctionary Server(Redis) 是一個由 Salvatore Sanfilippo 寫的 key-value 存儲系統,是跨平臺的非關系型數據庫。 Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協議、支持網絡、可基于內存、分布式、可選持久性的鍵值對(Key-Value)存…

(分塊)洛谷 P2801 教主的魔法 題解

之前學過 莫隊 算法&#xff0c;其運用了分塊思想&#xff1b;但是我居然是第一次寫純種的分塊題目。 題意 給你一個長度為 n n n 的序列 a a a&#xff08;一開始 ? a i ∈ [ 1 , 1000 ] \forall a_i\in[1,1000] ?ai?∈[1,1000]&#xff09;。要求執行 q q q 次操作&…

谷歌Chrome或微軟Edge瀏覽器修改網頁任意內容

在谷歌或微軟瀏覽器按F12&#xff0c;打開開發者工具&#xff0c;切換到console選項卡&#xff1a; 在下面的輸入行輸入下面的命令回車&#xff1a; document.body.contentEditable"true"效果如下&#xff1a;

【生日蛋糕——DFS剪枝優化】

題目 分析 代碼 #include <bits/stdc.h> using namespace std;const int N 24; const int inf 0x3f3f3f3f;int mins[N], minv[N]; int R[N], H[N]; int n, m, ans inf;void dfs(int u, int v, int s) {if(v minv[u] > n) return;if(s mins[u] > ans) return;…

【C++基礎十】泛型編程(模板初階)

【C基礎十】泛型編程—模板 1.什么是模板2.函數模板的實例化&#xff1a;2.1隱式實例化2.2顯示實例化 3.函數模板參數的匹配規則4.什么是類模板5.類模板的實例化6.聲明和定義分離 1.什么是模板 void swap(int& a, int& b) {int tmp 0;tmp a;a b;b tmp; }void swap…

如何修復 Tauri 發布后程序運行時顯示 `asset not found: index.html` 的問題

如何修復 Tauri 發布后程序運行時顯示 asset not found: index.html 的問題 在使用 Tauri 發布應用程序時&#xff0c;如果運行時出現 asset not found: index.html 的錯誤&#xff0c;通常是因為 Tauri 無法找到或正確加載前端資源文件&#xff08;如 index.html&#xff09;…

短視頻下載去水印,用什么工具好?

去除視頻和圖片水印是許多用戶的需求&#xff0c;尤其是在分享或保存內容時。以下是6款超好用的工具&#xff0c;幫助你輕松去除水印&#xff0c;享受純凈的視覺體驗&#xff1a; 1. 易下載去水印小程序 特點&#xff1a; 操作簡單&#xff0c;支持抖音、快手、小紅書、嗶哩嗶哩…

【華為OD-E卷 -121 消消樂游戲 100分(python、java、c++、js、c)】

【華為OD-E卷 - 消消樂游戲 100分(python、java、c++、js、c)】 題目 游戲規則:輸入一個只包含英文字母的字符串,字符串中的兩個字母如果相鄰且相同,就可以消除。 在字符串上反復執行消除的動作,直到無法繼續消除為止,此時游戲結束。 輸出最終得到的字符串長度 輸入描…

設計模式(行為型)-備忘錄模式

目錄 定義 類圖 角色 角色詳解 &#xff08;一&#xff09;發起人角色&#xff08;Originator&#xff09;? &#xff08;二&#xff09;備忘錄角色&#xff08;Memento&#xff09;? &#xff08;三&#xff09;備忘錄管理員角色&#xff08;Caretaker&#xff09;?…

YOLO簡史:從YOLOv1到YOLOv12的技術革新與演進

YOLO&#xff08;You Only Look Once&#xff09;系列算法自2015年誕生以來&#xff0c;憑借其“單次推理”的高效特性&#xff0c;徹底改變了目標檢測領域。從初代YOLO到最新的YOLOv12&#xff0c;每一次迭代都凝聚了研究者的智慧與工業界的實踐需求。本文梳理各版本的特性、技…

【技術報告】谷歌開源多模態大模型 Gemma-3

【技術報告】谷歌開源多模態大模型 Gemma-3 1. Gemma-3 簡介1.1 Gemma-3 的新功能1.2 與現有工作流的集成1.3 開始使用 Gemma-3 Gemma-3 技術報告&#xff1a;摘要Gemma-3 技術報告&#xff1a;1. 引言Gemma-3 技術報告&#xff1a;2. 模型架構2.1 視覺模態2.2 預訓練2.3 量化感…

[ISP] 人眼中的顏色

相機是如何記錄顏色的&#xff0c;又是如何被顯示器還原的&#xff1f; 相機通過記錄RGB數值然后顯示器顯示RGB數值來實現顏色的記錄和呈現。道理是這么個道理&#xff0c;但實際上各廠家生產的相機對光的響應各不相同&#xff0c;并且不同廠家顯示器對三原色的顯示也天差地別&…

InfiniBand可靠連接(RC)模式:設計原理、核心機制與應用實踐

引言 InfiniBand作為一種高性能網絡互連技術&#xff0c;廣泛應用于超算集群、分布式存儲和金融交易系統等領域。其可靠連接&#xff08;Reliable Connection, RC&#xff09;模式以硬件級的有序性、可靠性和低延遲特性成為關鍵場景的首選。本文結合技術原理、機制對比和實際應…

【網絡】Caddy 服務器如何提供 TLS(Transport Layer Security)(傳輸層安全協議)

這張圖片介紹了 Caddy 服務器如何提供 TLS&#xff08;傳輸層安全協議&#xff09; 支持&#xff0c;確保通信的安全性。以下是對圖片內容的詳細分析 1. Caddy 是什么&#xff1f; Caddy 是一個現代化的 Web 服務器&#xff0c;以其簡單易用和自動化的 HTTPS 支持而聞名。它內…

GHCTF web方向題解

upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…

《Python實戰進階》No21:數據存儲:Redis 與 MongoDB 的使用場景

第21集&#xff1a;數據存儲&#xff1a;Redis 與 MongoDB 的使用場景 摘要 在現代應用開發中&#xff0c;數據存儲的選擇直接影響系統的性能、擴展性和成本。Redis 和 MongoDB 是兩種極具代表性的數據庫技術&#xff0c;它們分別擅長解決不同場景下的問題。本文將深入探討 Re…

【Agent】OpenManus-Prompt組件詳細分析

1. 提示詞架構概述 OpenManus 的提示詞組件采用了模塊化設計&#xff0c;為不同類型的智能體提供專門的提示詞模板。每個提示詞模塊通常包含兩種核心提示詞&#xff1a;系統提示詞&#xff08;System Prompt&#xff09;和下一步提示詞&#xff08;Next Step Prompt&#xff0…

藍橋杯刷題周計劃(第三周)

目錄 前言題目一題目代碼題解分析 題目二題目代碼題解分析 題目三題目代碼題解分析 題目四題目代碼題解分析 題目五題目代碼題解分析 題目六題目代碼題解分析 題目七題目代碼題解分析 題目八題目代碼題解分析 題目九題目代碼題解分析 題目十題目代碼題解分析 前言 大家好&#…