【C#】Socket通信的使用

在C#中,Socket通信是一種用于實現網絡通信的底層技術。通過Socket,程序可以在網絡上與其他設備進行數據交換。以下是如何使用C#中的System.Net.Sockets命名空間來實現Socket通信的詳細步驟。

1. Socket通信的基本概念

  • Socket: 一個Socket是網絡通信的端點,它封裝了IP地址和端口號。
  • Server(服務器端): 監聽客戶端的連接請求,并處理數據。
  • Client(客戶端): 主動發起與服務器的連接,并發送或接收數據。
  • 協議: 常用的協議有TCP(面向連接、可靠傳輸)和UDP(無連接、不可靠但高效)。

2. 使用TCP協議的Socket通信

(1) 服務器端代碼

服務器端需要監聽指定的IP地址和端口,等待客戶端的連接請求。

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class TcpServer
{static void Main(string[] args){// 定義IP地址和端口號IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); // 本地回環地址int port = 8888;// 創建Socket對象Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);try{// 綁定IP地址和端口listener.Bind(new IPEndPoint(ipAddress, port));listener.Listen(10); // 設置最大連接數為10Console.WriteLine("服務器已啟動,等待客戶端連接...");// 接受客戶端連接Socket handler = listener.Accept();Console.WriteLine("客戶端已連接!");// 接收數據byte[] buffer = new byte[1024];int bytesReceived = handler.Receive(buffer);string receivedData = Encoding.UTF8.GetString(buffer, 0, bytesReceived);Console.WriteLine($"接收到的數據: {receivedData}");// 發送響應數據string response = "Hello from server!";byte[] responseData = Encoding.UTF8.GetBytes(response);handler.Send(responseData);// 關閉連接handler.Shutdown(SocketShutdown.Both);handler.Close();}catch (Exception ex){Console.WriteLine($"發生錯誤: {ex.Message}");}finally{listener.Close();}}
}

(2) 客戶端代碼

客戶端需要主動連接到服務器,并發送或接收數據。

using System;
using System.Net.Sockets;
using System.Text;class TcpClientExample
{static void Main(string[] args){// 定義服務器的IP地址和端口號string serverIp = "127.0.0.1";int port = 8888;// 創建Socket對象Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);try{// 連接到服務器client.Connect(serverIp, port);Console.WriteLine("已連接到服務器!");// 發送數據string message = "Hello from client!";byte[] data = Encoding.UTF8.GetBytes(message);client.Send(data);// 接收服務器響應byte[] buffer = new byte[1024];int bytesReceived = client.Receive(buffer);string response = Encoding.UTF8.GetString(buffer, 0, bytesReceived);Console.WriteLine($"服務器響應: {response}");}catch (Exception ex){Console.WriteLine($"發生錯誤: {ex.Message}");}finally{client.Close();}}
}

3. 使用UDP協議的Socket通信

(1) 服務器端代碼

UDP是無連接的協議,服務器不需要顯式接受連接。

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class UdpServer
{static void Main(string[] args){// 定義IP地址和端口號IPAddress ipAddress = IPAddress.Parse("127.0.0.1");int port = 9999;// 創建Socket對象UdpClient udpServer = new UdpClient(port);Console.WriteLine("UDP服務器已啟動,等待數據...");// 接收數據IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);byte[] receivedData = udpServer.Receive(ref remoteEndPoint);string message = Encoding.UTF8.GetString(receivedData);Console.WriteLine($"接收到的數據: {message} 來自 {remoteEndPoint}");// 發送響應數據string response = "Hello from UDP server!";byte[] responseData = Encoding.UTF8.GetBytes(response);udpServer.Send(responseData, responseData.Length, remoteEndPoint);// 關閉SocketudpServer.Close();}
}

(2) 客戶端代碼

客戶端直接向服務器發送數據,無需建立連接。?

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;class UdpClientExample
{static void Main(string[] args){// 定義服務器的IP地址和端口號string serverIp = "127.0.0.1";int port = 9999;// 創建Socket對象UdpClient udpClient = new UdpClient();try{// 發送數據IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(serverIp), port);string message = "Hello from UDP client!";byte[] data = Encoding.UTF8.GetBytes(message);udpClient.Send(data, data.Length, serverEndPoint);// 接收服務器響應byte[] receivedData = udpClient.Receive(ref serverEndPoint);string response = Encoding.UTF8.GetString(receivedData);Console.WriteLine($"服務器響應: {response}");}catch (Exception ex){Console.WriteLine($"發生錯誤: {ex.Message}");}finally{udpClient.Close();}}
}

4. 注意事項

  1. 異常處理: 在實際開發中,必須對網絡異常(如超時、連接中斷等)進行處理。
  2. 多線程支持: 如果需要同時處理多個客戶端連接,可以使用多線程或異步編程。
  3. 防火墻和端口: 確保服務器的端口未被防火墻阻止。
  4. 編碼格式: 數據傳輸時需注意編碼格式的一致性(如UTF-8)。

以上是C#中Socket通信的基本實現方法。根據實際需求,可以選擇TCP或UDP協議,并結合異步編程(如async/await)提高性能和可擴展性。

C# async/await的使用_c# async await用法-CSDN博客文章瀏覽閱讀1.3k次,點贊5次,收藏8次。本文詳細介紹了C#中async和await關鍵字在實現異步編程中的作用,包括如何定義異步方法、await用于等待異步操作完成的特點,以及注意事項,如避免阻塞操作和正確嵌套。這些技術有助于提升程序性能和響應性。 https://blog.csdn.net/wangnaisheng/article/details/136037585?spm=1011.2415.3001.5331

?

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

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

相關文章

2024年第九屆團隊程序設計天梯賽c++題解L1-L3-1(附PTA網址)

L1-1 編程解決一切 5分 L1-097 編程解決一切 - 團體程序設計天梯賽-練習集 (pintia.cn)https://pintia.cn/problem-sets/994805046380707840/exam/problems/type/7?problemSetProblemId1781658570803388416 #include<bits/stdc.h> #define int long long using namesp…

ICMAN防水觸摸芯片 - 復雜環境下精準交互,提升觸控體驗

▍核心優勢 ◆ 超強抗干擾能力 ◆ 工業級設計&#xff0c;一致性和穩定性好 ▍提供場景化解決方案 【智能廚電矩陣】抽油煙機檔位調節 | 電磁爐火力觸控 | 洗碗機模式切換 【衛浴設備方案】淋浴房霧化玻璃控制 | 智能馬桶觸控面板 | 浴缸水位感應 【工業控制應用】儀器儀…

Golang|抽獎相關

文章目錄 抽獎核心算法生成抽獎大轉盤抽獎接口實現 抽獎核心算法 我們可以根據 單商品庫存量/總商品庫存量 得到每個商品被抽中的概率&#xff0c;可以想象這樣一條 0-1 的數軸&#xff0c;數軸上的每一段相當于一種商品&#xff0c;概率之和為1。 抽獎時&#xff0c;我們會生…

OpenCV 圖形API(43)顏色空間轉換-----將 BGR 圖像轉換為 LUV 色彩空間函數BGR2LUV()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 將圖像從BGR色彩空間轉換為LUV色彩空間。 該函數將輸入圖像從BGR色彩空間轉換為LUV。B、G和R通道值的傳統范圍是0到255。 輸出圖像必須是8位無符…

【Python】用Python寫一個俄羅斯方塊玩玩

【Python】用Python寫一個俄羅斯方塊玩玩 一、引言1.成品效果展示 二、思考準備1.思考設計2.代碼設計2.1 游戲頁面2.2 控件設計2.2.1 方塊生成2.2.2 方塊碰撞2.2.3 方塊消融2.2.4 游戲主循環2.2.5 游戲窗口 三、游戲完整版 一、引言 今日看到侄子在玩游戲&#xff0c;湊近一看…

維港首秀!沃飛長空AE200亮相香港特別行政區

4月13日-16日&#xff0c;第三屆香港國際創科展在香港會議展覽中心盛大舉辦。 作為國內領先、國際一流的eVTOL主機廠&#xff0c;沃飛長空攜旗下AE200批產構型登陸國際舞臺&#xff0c;以前瞻性的創新技術與商業化應用潛力&#xff0c;吸引了來自全球17個國家及地區的行業領袖…

Openfein實現遠程調用的方法(實操)

文章目錄 環境準備一、URL中接收參數二、接收一個參數三、接收多個參數四、傳遞對象五、傳遞JSON格式數據 環境準備 下面的配置&#xff0c;服務調用方加入即可。 依賴導入&#xff1a; <!-- openfeign依賴--><dependency><groupId>org.springframe…

Bright+Data網頁解鎖器:旅游行業數據革命的“隱形引擎”

在數字經濟浪潮中&#xff0c;旅游行業正經歷前所未有的變革。當消費者指尖滑動間完成跨國酒店預訂&#xff0c;當航空公司每秒調整萬次艙位價格&#xff0c;背后是一場無聲的數據戰爭。而在這場戰爭中&#xff0c;BrightData網頁解鎖器正成為旅游企業破局的關鍵武器——它像一…

OpenCV 圖形API(38)圖像濾波-----Sobel 算子操作函數Sobel()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::gapi::Sobel 函數是 OpenCV 的 G-API 模塊中用于執行 Sobel 算子操作的一個函數&#xff0c;主要用于圖像的邊緣檢測。Sobel 算子通過計算圖…

CS5346 - Interactivity in Visualization 可視化中的交互

文章目錄 Visualization representation interactionInteraction &#xff08;交互&#xff09;Benefits (好處)Typical Interaction Techniques&#xff08;交互技術&#xff09;SelectFilteringAbstract / Elaborate幾何放縮&#xff08;Geometric zoom)語義放縮&#xff0…

第十六屆藍橋杯大賽軟件賽省賽 C++ 大學 B 組 部分題解

賽時參加的是Python組&#xff0c;這是賽后寫的題解&#xff0c;還有兩題暫時還不會&#xff0c;待更新 題目鏈接題目列表 - 洛谷 | 計算機科學教育新生態 A 移動距離 答案&#xff1a;1576 C 可分解的正整數 Python3 import itertools from functools import cmp_to_ke…

Vue 解決 Error: please transfer a valid prop path to form item!

在 Vue.js 中使用表單驗證庫&#xff08;如 VeeValidate 或 Element UI 的表單組件時&#xff09;&#xff0c;遇到錯誤信息 "please transfer a valid prop path to form item!" 通常指的是在表單項的屬性綁定中&#xff0c;路徑&#xff08;prop path&#xff09;不…

在 Visual Studio Code 中安裝通義靈碼 - 智能編碼助手

高效的編碼工具對于提升開發效率和代碼質量至關重要。 通義靈碼作為一款智能編碼助手&#xff0c;為開發者提供了全方位的支持。 本文將詳細介紹如何在 Visual Studio Code&#xff08;簡稱 VSCode&#xff09;中安裝通義靈碼&#xff0c;以及如何進行相關配置以開啟智能編碼…

SQL 解析 with as dual sysdate level

目錄 sql的運行順序 with as EXTRACT ?編輯 dual sysdate level ?編輯 ?編輯 Oracle中的日期存儲 核心部分 拆解字符串并計算最小值 關聯子查詢 NVL 函數 REGEXP_SUBSTR() sql的運行順序 <select id="getTrendList" parameterType="java.uti…

快手OneRec 重構推薦系統:從檢索排序到生成統一的躍遷

文章目錄 1. 背景2. 方法2.1 OneRec框架2.2 Preliminary2.3 生成會話列表2.4 利用獎勵模型進行迭代偏好對齊2.4.1 訓練獎勵模型2.4.2 迭代偏好對齊 3. 總結 昨天面試的時候聊到了OneRec&#xff0c;但是由于上次看這篇文章已經是一個月之前&#xff0c;忘得差不多了&#xff0c…

軟考高級系統架構設計師-第11章 系統架構設計

【本章學習建議】 根據考試大綱&#xff0c;本章不僅考查系統架構設計師單選題&#xff0c;預計考12分左右&#xff0c;而且案例分析和論文寫作也是必考&#xff0c;對應第二版教材第7章&#xff0c;屬于重點學習的章節。 軟考高級系統架構設計師VIP課程https://edu.csdn.net/…

selenium之文件下載

Selenium 自動化測試&#xff1a;輕松搞定文件下載 在 Web 自動化測試中&#xff0c;經常會遇到需要驗證文件下載功能的場景。例如&#xff0c;測試報告的導出、用戶上傳文件的下載、PDF 文檔的生成與下載等等。Selenium 本身并沒有直接處理文件下載的內置方法&#xff0c;但我…

基于遷移學習實現肺炎X光片診斷分類

大家好&#xff0c;我是帶我去滑雪&#xff01; 肺炎是全球范圍內致死率較高的疾病之一&#xff0c;尤其是在老年人、免疫系統較弱的患者群體中&#xff0c;更容易引發嚴重并發癥。傳統上&#xff0c;肺炎的診斷依賴于醫生的臨床經驗以及影像學檢查&#xff0c;尤其是X光片&…

工業數據治理范式革新:時序數據庫 TDengine虛擬表技術解析

小T導讀&#xff1a;在工業數字化過程中&#xff0c;數據如何從設備采集順利“爬坡”到上層應用&#xff0c;一直是個難題。傳統“單列模型”雖貼合設備協議&#xff0c;卻讓上層分析舉步維艱。TDengine 用一種更聰明的方法打通了這條數據通路&#xff1a;不強求建模、不手動轉…

Redis面試——日志

一、RDB&#xff08;Redis DataBase&#xff09; RDB 全程是 Redis DataBase&#xff0c;它是一種將 Redis 在某一時刻內存中的數據以快照形式保存到磁盤的機制 &#xff0c;相當于給執行save/bgsave命令時刻的內存數據庫數據拍了一張快照我們如果通過save命令來執行快照&…