WebSocket是服務(wù)一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,它使得客戶(hù)端和服務(wù)器之間可以實(shí)時(shí)雙向(xiang)傳輸數據,服務(wù)而不需要頻繁地建立和關(guān)閉連接,服務(wù)WebSocket在.NET中的服務(wù)實(shí)現主要依賴(lài)于System.Net.WebSockets命名空間。
在使用WebSocket之前(qian),服務(wù)需要先安裝相應的服務(wù)庫,在項目中,服務(wù)可以通過(guò)(guo)NuGet包管理器來(lái)安裝ヽ(′ー`)ノMicrosoft.As??pNetCore.WebSockets包。服務(wù)
1、服務(wù)引入命名空間:
u(′ω`)sing System;using System.Net.WebSockets;using System.Textヽ(′▽?zhuān)?ノ;using System.Thre(???)ading;using System.Threading.Tas( ?° ?? ?°)ks;
2、服務(wù)創(chuàng )建(jian)一個(gè)W???ebSocket服務(wù)器類(lèi):
public class WebSocketServer{ private readonly HttpListener _listener; private readonly="" CancellationTokenSource(//ω//) _cancellationTokenSource = new CancellationTokenSource(); public WebSocketServer(string url) { _listener = new HttpListener(); _listener.Prefixes.Add(url); _listener.Start(); } public async Task Start() { while (!_cancellationToke(′_`)nSource.Iヽ(′▽?zhuān)?/sCancellationRequested) { var co(╯‵□′)╯ntext = await?? _listener.GetContextAsync(); if (context != null && context.RequestType == "CONNECT") { await ProcessRequest(context); } } } private async Task ProcessRequest(HttpListenerContext context) { var webSocketContext = await context.Acc??eptWebSocketAsy(′?_?`)nc(null); if (webSocketContext !=(′ω`) null) { // 處理WebSocket連接請求 await ProcessWebSocketConnection??(webSocketContext); } } privaヽ(′?`)ノte async Task ProcessWebSocketConnection(HttpListenerWebSocketContext webSocketContext) { try { // 讀取客戶(hù)端發(fā)送的服務(wù)消息并廣播給所有連接的客戶(hù)端 using (var buffer = new byte[1024]) { var bytesRead = await webSocketC??ontext.ReceiveAsync(new ArraySegment<byte&g(??ヮ?)?*:???t;(buffer), CancellationTok???en.None); if (bytesRead > 0) { var mes┐(′ー`)┌sage = Encoding.UTF8.GetString(buffer, 0, bytesRead); await SendMessageToAllClients(message); } } } catc(′?_?`)h (Exception ex) { Console.WriteLine($"Error: { ex.Message}"); } finally { webSocketC??ont??ext.Abort(); // 關(guān)閉WebSocket連接 } }}1、引入JavaScript庫:<script src="https://cdnjs.cloudflare.c??om/ajax/libs/sockjsclient/1.5.0/sockjs.min.j??s"></script> 和 <sc??ript src="https://cdnjs.cloudflare??.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>,服務(wù)這兩個(gè)庫分別用于處理WebSocket連接和??消(xiao)息傳遞。服務(wù)
<!DOCT??YPE html><html lang="en"><head> <meta charset="UTF8"> <meta name="viewport" content="width=devicewidth, initialscale=1.0"> <title>WebSocket Client</t┐(′ー`)┌itle></h(′?_?`)ead><body> <input type="text" id="message" placeholder="Enter a message..."&(′?`)gt; <button onclick="(╯°□°)╯;sendMessage()">Send</button> <div id="chat"></div> <script> var socket = new SockJS('/ws'); // Weヽ(′ー`)ノbSocket服務(wù)器(′?`)地址,根據實(shí)際情況修改 var stompClient = Stomp.over(socket); // 使用STOMP協(xié)議處理消息傳遞,需要(′ω`)先安裝stomp.js庫(參考上面的步驟) stompCl??ient.co(╯°□°)╯︵ ┻━┻nnect({ }, function (frame) { console.log('Connected: ' + frame); }); // 連接到WebSocket服務(wù)器,成功連接后會(huì )觸發(fā)回調函數,打印日志信息到控制臺。