WebSocket實時雙向通信:從基礎到實戰

一、WebSocket 基礎概念

1. 什么是 WebSocket?

  • 雙向通信協議:與 HTTP 的單向請求不同,WebSocket 支持服務端和客戶端實時雙向通信

  • 低延遲:適用于聊天室、實時數據推送、在線游戲等場景。

  • 協議標識ws://(非加密)或?wss://(加密)。


二、環境準備

1. 開發環境

  • .NET 版本:.NET Framework 4.5+ 或 .NET Core 3.1+

  • IDE:Visual Studio 2019+ 或 VS Code

  • 命名空間System.Net.WebSockets


三、服務端實現(ASP.NET Core)

1. 創建 WebSocket 服務端

using System.Net.WebSockets;
using System.Text;public class WebSocketHandler
{public async Task HandleWebSocket(HttpContext context){// 1. 接受 WebSocket 連接請求WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();// 2. 接收客戶端消息var buffer = new byte[1024];WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);while (!result.CloseStatus.HasValue){// 3. 解析消息內容string message = Encoding.UTF8.GetString(buffer, 0, result.Count);Console.WriteLine($"收到消息: {message}");// 4. 回復客戶端(示例:原樣返回消息)await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count),result.MessageType,result.EndOfMessage,CancellationToken.None);// 繼續接收下一條消息result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);}// 5. 關閉連接await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);}
}
 

2. 配置 ASP.NET Core 中間件

// Program.cs
app.UseWebSockets(); // 啟用 WebSocket 中間件app.Map("/ws", async context =>
{if (context.WebSockets.IsWebSocketRequest){var handler = new WebSocketHandler();await handler.HandleWebSocket(context);}else{context.Response.StatusCode = 400;await context.Response.WriteAsync("請使用 WebSocket 協議訪問");}
});
 

四、客戶端實現(控制臺應用)

1. 客戶端連接代碼

using System.Net.WebSockets;
using System.Text;public class WebSocketClient
{public async Task ConnectAsync(string url){ClientWebSocket webSocket = new ClientWebSocket();// 1. 連接到服務端await webSocket.ConnectAsync(new Uri(url), CancellationToken.None);Console.WriteLine("已連接到服務端");// 2. 發送消息string message = "Hello, WebSocket!";byte[] buffer = Encoding.UTF8.GetBytes(message);await webSocket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);// 3. 接收服務端響應buffer = new byte[1024];WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);string response = Encoding.UTF8.GetString(buffer, 0, result.Count);Console.WriteLine($"收到回復: {response}");// 4. 關閉連接await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "關閉連接", CancellationToken.None);}
}
 

2. 調用客戶端

// Main 方法
static async Task Main(string[] args)
{WebSocketClient client = new WebSocketClient();await client.ConnectAsync("ws://localhost:5000/ws");
}
 

五、運行測試步驟

  1. 啟動服務端

    dotnet run
     
  2. 運行客戶端
    客戶端控制臺輸出:

    已連接到服務端
    收到回復: Hello, WebSocket!
     

六、核心 API 說明

方法/屬性說明
AcceptWebSocketAsync()服務端接受 WebSocket 連接請求
SendAsync()發送消息(支持文本和二進制數據)
ReceiveAsync()異步接收消息
CloseAsync()正常關閉連接
WebSocketMessageType.Text指定消息類型為文本

七、注意事項

  1. 跨域問題
    在 ASP.NET Core 中配置 CORS:

    services.AddCors(options => options.AddPolicy("AllowAll", builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()));
     
  2. 心跳檢測
    添加心跳機制防止連接超時:

    webSocket.Options.KeepAliveInterval = TimeSpan.FromSeconds(30);
     
  3. 異常處理
    使用?try-catch?捕獲?WebSocketException

    try {// WebSocket 操作代碼
    } catch (WebSocketException ex) {Console.WriteLine($"連接異常: {ex.Message}");
    }
     
  4. 性能優化

    • 使用?ArrayPool<byte>?重用緩沖區

    • 多線程處理高并發連接

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

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

相關文章

【算法】分支限界法和貪心、動態規劃、回溯、分治法的區別是

什么是分支限界法 分支限界法是一種用于求解最優化問題的算法,其核心思想是通過剪枝策略減少搜索空間。 分支限界法常以廣度優先或以最小耗費(最大效益)優先的方式搜索問題的解空間樹。 在分支限界法中,每一個活結點只有一次機會成為擴展結點。活結點一旦成為擴展結點,就…

[自動化集成] 使用明道云上傳附件并在Python后端處理Excel的完整流程

在企業日常自動化場景中,使用低代碼平臺如明道云搭建前端界面,結合自定義Python后端服務,實現靈活數據處理是一種高效的組合方式。本文將分享一個典型的集成用例:用戶通過明道云上傳文本和Excel附件,Python后端接收并解析這些信息,最終實現完整的數據處理閉環。 項目背景…

ubuntu下實時檢測機械硬盤和固態硬盤溫度

sudo apt update sudo apt install smartmontools然后&#xff0c;使用smartctl命令查看硬盤的詳細信息&#xff0c;包括溫度&#xff1a; sudo smartctl -a /dev/sda實時監控硬盤溫度 雖然smartctl不能直接實時顯示溫度&#xff0c;你可以使用watch命令結合smartctl來定期查…

游戲開發實戰(二):Python復刻「崩壞星穹鐵道」嗷嗚嗷嗚事務所---源碼級解析該小游戲背后的算法與設計模式【純原創】

文章目錄 奇美拉和隊列奇美拉被動技能多對多觀察者關系實現自定義元類奇美拉基類 管理奇美拉的隊列奇美拉隊列類心得體會擴展 規則定義工作相關奇美拉相關 奇美拉屬性 在本篇博文&#xff0c;我將介紹本項目的整體框架&#xff0c;以及“編碼規則”&#xff0c;這些規則保證了本…

Redis實現分布式鎖的進階版:Redisson實戰指南

一、為什么選擇Redisson&#xff1f; 在上一篇文章中&#xff0c;我們通過Redis原生命令實現了分布式鎖。但在實際生產環境中&#xff0c;這樣的基礎方案存在三大痛點&#xff1a; 鎖續期難題&#xff1a;業務操作超時導致鎖提前釋放不可重入限制&#xff1a;同一線程無法重復…

大語言模型 12 - 從0開始訓練GPT 0.25B參數量 MiniMind2 補充 訓練開銷 訓練步驟 知識蒸餾 LoRA等

寫在前面 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是目前最廣泛應用的大語言模型架構之一&#xff0c;其強大的自然語言理解與生成能力背后&#xff0c;是一個龐大而精細的訓練流程。本文將從宏觀到微觀&#xff0c;系統講解GPT的訓練過程&#xff0c;…

SID 2025上的天馬,用“好屏”技術重構產業敘事

作為全球最具影響力的顯示行業盛會&#xff0c;SID國際顯示周不僅是技術比拼的舞臺&#xff0c;更是未來產業方向的風向標。SID 2025上的技術密度與產業動態&#xff0c;再一次驗證了這一定律。 Micro-LED、柔性OLED、裸眼3D、量子點、透明顯示等新技術在SID 2025集中亮相&…

【AI News | 20250520】每日AI進展

AI Repos 1、nanoDeepResearch nanoDeepResearch 是一個受 ByteDance 的 DeerFlow 項目啟發&#xff0c;旨在從零開始構建深度研究代理的后端項目。它不依賴 LangGraph 等現有框架&#xff0c;通過實現一個 ReAct 代理和狀態機來模擬 Deep Research 的工作流程。項目主要包含規…

釘釘開發之AI消息和卡片交互開發文檔收集

AI消息和卡片交互開發文檔 智能交互接口能力介紹 AI助理發消息&#xff08;主動直接發送模式 AI 助理發消息 - 主動發送模式 AI 助理發消息 - 回復消息模式 AI 助理發消息 - Webhook 回復消息模式 Stream 模式響應卡片回傳請求事件 upload-media-files AI 助理發消息&a…

Redis中的事務和原子性

在 Redis 中&#xff0c;事務 和 原子性 是兩個關鍵概念&#xff0c;用于保證多個操作的一致性和可靠性。以下是 Redisson 和 Spring Data Redis 在處理原子性操作時的區別與對比&#xff1a; 1. Redis 的原子性機制 Redis 本身通過以下方式保證原子性&#xff1a; 單線程模型…

Apollo10.0學習——planning模塊(8)之scenario、Stage插件詳解二

scenario插件 插件總覽插件ValetParkingScenario階段一&#xff1a;StageApproachingParkingSpotprocess()方法 階段二&#xff1a;StageParkingprocess()方法FinishStage方法 插件PullOverScenarioIsTransferable: 場景切入條件 代碼邏輯階段一&#xff1a;PullOverStageAppro…

JVM的面試相關問題

面試中的相關問題主要是三塊 1.JVM 內存區域劃分 2.JVM 的類加載機制 3.JVM 的垃圾回收機制 JVM Java虛擬機 VM Virtual Machine 虛擬機,用 軟件 來 模擬 硬件 傳統意義上的"虛擬機" 更多指的是 VMWare, Virtual Box, Hyper-V, KVM(構造出虛擬的電腦,甚至可以…

win10使用nginx做簡單負載均衡測試

一、首先安裝Nginx&#xff1a; 官網鏈接&#xff1a;https://nginx.org/en/download.html 下載完成后&#xff0c;在本地文件中解壓。 解壓完成之后&#xff0c;打開conf --> nginx.config 文件 1、在 http 里面加入以下代碼 upstream GY{#Nginx是如何實現負載均衡的&a…

[特殊字符]車牌識別相機,到底用在哪?

停車場管理&#xff0c;快速通行不是夢 停車場大概是車牌識別相機最常見的 “工作崗位” 啦&#xff01;以前進出停車場&#xff0c;取卡、刷卡、人工收費&#xff0c;一系列操作下來&#xff0c;高峰期的時候真的能把人等得不耐煩&#x1f62b; 現在有了車牌識別相機&#xff…

nosqlbooster pojie NoSQLBooster for MongoDB

測過可用&#xff0c;注意 asar的安裝使用報錯改用 npx asar extract app.asar app 路徑 C:\Users{computerName}\AppData\Local\Programs\nosqlbooster4mongo\resources npm install asar -g asar extract app.asar app 打開shared\lmCore.js 修改MAX_TRIAL_DAYS3000 修改…

組態王通過開疆智能profinet轉ModbusTCP網關連接西門子PLC配置案例

本案例是組態王通過使用開疆智能研發的Profinet轉ModbusTCP網關采集西門子1200PLC中數據的案例。 網關配置 首先來配置網關的參數&#xff0c;打開網關配置軟件“Gateway Configuration Studio” 由于組態王那側設定為ModbusTCP客戶端所以網關作為ModbusTCP服務器。新建項目…

大模型服務如何實現高并發與低延遲

寫在前面 大型語言模型(LLM)正以前所未有的速度滲透到各行各業,從智能客服、內容創作到代碼生成、企業知識庫,其應用場景日益豐富。然而,將這些強大的 AI 能力轉化為穩定、高效、可大規模應用的服務,卻面臨著巨大的挑戰,其中高并發處理能力和低響應延遲是衡量服務質量的…

k8s監控方案實踐補充(二):使用kube-state-metrics獲取資源狀態指標

k8s監控方案實踐補充&#xff08;二&#xff09;&#xff1a;使用kube-state-metrics獲取資源狀態指標 文章目錄 k8s監控方案實踐補充&#xff08;二&#xff09;&#xff1a;使用kube-state-metrics獲取資源狀態指標一、Metrics Server簡介二、kube-state-metrics實戰部署1. 創…

Manus 全面開放注冊,OpenAI 發布 Codex,ChatGPT 上線 GPT-4.1!| AI Weekly 5.12-18

&#x1f4e2;本周 AI 快訊 | 1 分鐘速覽&#x1f680; 1?? &#x1f4dd; Manus 全面開放注冊 &#xff1a;無需邀請碼即可注冊&#xff0c;新用戶免費獲得 1000 積分&#xff0c;每日 300 積分免費任務。 2?? &#x1f50d; 阿里 Qwen 推出「深入研究」 &#xff1a;Qw…

代理(主要是動態)和SpringAOP

代理 靜態代理基于繼承實現動態代理是基于接口實現 業務層每次實現轉賬都需要執行&#xff0c;可以把他們拿出來當成一個切面&#xff0c;自己寫出一個代理類&#xff0c;讓業務層只執行業務的邏輯&#xff0c;重復的代碼代理類來完成&#xff0c;然后調用代理類來執行。 代理類…