最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 中 WebSocket 與 SignalR實(shí)時通信的兩種方案

 更新時間:2025年05月07日 09:14:18   作者:吳五萬  
在現(xiàn)代 Web 應(yīng)用中,實(shí)時通信變得越來越重要,無論是聊天應(yīng)用、在線游戲、股票行情推送還是協(xié)作編輯工具,都需要服務(wù)器能夠主動向客戶端推送數(shù)據(jù),本文將對這兩種技術(shù)進(jìn)行比較,分析它們的異同點(diǎn)和使用場景,并提供簡單示例代碼幫助你快速上手,感興趣的朋友一起看看吧

在現(xiàn)代 Web 應(yīng)用中,實(shí)時通信變得越來越重要。無論是聊天應(yīng)用、在線游戲、股票行情推送還是協(xié)作編輯工具,都需要服務(wù)器能夠主動向客戶端推送數(shù)據(jù)。在 .NET 生態(tài)系統(tǒng)中,WebSocket 和 SignalR 是實(shí)現(xiàn)這一功能的兩個主要方案。

本文將對這兩種技術(shù)進(jìn)行比較,分析它們的異同點(diǎn)和使用場景,并提供簡單示例代碼幫助你快速上手。

一、什么是 WebSocket?

WebSocket 是 HTML5 提供的一種全雙工通信協(xié)議,允許客戶端與服務(wù)器之間建立持久連接,實(shí)現(xiàn)雙向?qū)崟r通信。相比傳統(tǒng)的 HTTP 請求-響應(yīng)模式,WebSocket 更加高效,適合需要頻繁交互的應(yīng)用。

WebSocket 特點(diǎn):

  • 基于 TCP 協(xié)議
  • 支持雙向通信
  • 連接是長連接(保持打開)
  • 輕量級,性能高
  • 需要手動管理連接和消息處理

使用場景:

  • 實(shí)時數(shù)據(jù)推送(如股票行情)
  • 在線多人游戲
  • 多人協(xié)作編輯
  • IoT 設(shè)備通信等

二、什么是 SignalR?

SignalR 是微軟開發(fā)的一個基于 .NET 的庫,它簡化了實(shí)時通信的實(shí)現(xiàn)。SignalR 內(nèi)部封裝了多種傳輸方式(包括 WebSocket、Server-Sent Events、長輪詢等),并根據(jù)瀏覽器和網(wǎng)絡(luò)環(huán)境自動選擇最優(yōu)的方式。

SignalR 特點(diǎn):

  • 抽象了底層通信細(xì)節(jié)
  • 支持跨平臺(.NET Core / .NET 6+)
  • 自動降級兼容性差的瀏覽器
  • 提供 Hub 模式,易于組織業(yè)務(wù)邏輯
  • 可集成到 ASP.NET Core 中

使用場景:

  • 快速構(gòu)建實(shí)時功能(無需關(guān)注底層通信細(xì)節(jié))
  • Web 應(yīng)用中的通知系統(tǒng)
  • 即時通訊(IM)應(yīng)用
  • 實(shí)時儀表盤、狀態(tài)監(jiān)控

三、WebSocket vs SignalR 對比

特性WebSocketSignalR
通信方式全雙工全雙工(通過封裝)
是否需要手動處理連接? 需要? 不需要
是否支持多路復(fù)用? 不支持? 支持(Hub)
是否支持自動降級? 不支持? 支持(長輪詢等)
開發(fā)復(fù)雜度較高較低
性能略低于 WebSocket
適合場景高性能、定制化通信快速開發(fā)、通用實(shí)時功能

四、示例代碼

示例 1:WebSocket 服務(wù)端 + 客戶端(.NET)

服務(wù)端(控制臺程序)

using System;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
class Program
{
    static async Task Main(string[] args)
    {
        HttpListener listener = new HttpListener();
        listener.Prefixes.Add("http://localhost:5000/");
        listener.Start();
        Console.WriteLine("WebSocket Server started on http://localhost:5000");
        while (true)
        {
            HttpListenerContext context = await listener.GetContextAsync();
            if (context.Request.IsWebSocketRequest)
            {
                WebSocketContext webSocketContext = await context.AcceptWebSocketAsync(null);
                _ = HandleWebSocketConnection(webSocketContext.WebSocket);
            }
            else
            {
                context.Response.StatusCode = 400;
                context.Response.Close();
            }
        }
    }
    private static async Task HandleWebSocketConnection(WebSocket socket)
    {
        byte[] buffer = new byte[1024 * 4];
        while (socket.State == WebSocketState.Open)
        {
            WebSocketReceiveResult result = await socket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            string message = Encoding.UTF8.GetString(buffer, 0, result.Count);
            Console.WriteLine($"Received: {message}");
            // Echo back the message
            byte[] response = Encoding.UTF8.GetBytes($"Echo: {message}");
            await socket.SendAsync(new ArraySegment<byte>(response), WebSocketMessageType.Text, true, CancellationToken.None);
        }
    }
}

客戶端(JavaScript)

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Client</title>
</head>
<body>
    <input type="text" id="messageInput" placeholder="Enter message" />
    <button onclick="sendMessage()">Send</button>
    <div id="output"></div>
    <script>
        const ws = new WebSocket('ws://localhost:5000');
        ws.onmessage = function (event) {
            document.getElementById('output').innerText += event.data + '\n';
        };
        function sendMessage() {
            const input = document.getElementById('messageInput');
            const message = input.value;
            ws.send(message);
            input.value = '';
        }
    </script>
</body>
</html>

示例 2:SignalR 服務(wù)端 + 客戶端(ASP.NET Core)

服務(wù)端(Startup.cs 或 Program.cs)

var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddSignalR();
var app = builder.Build();
app.MapHub<ChatHub>("/chatHub");
app.Run();
public class ChatHub : Hub
{
    public async Task Send(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveMessage", user, message);
    }
}

客戶端(JavaScript)

<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/5.0.13/signalr.min.js"></script>
<input type="text" id="userInput" placeholder="User" />
<input type="text" id="messageInput" placeholder="Message" />
<button onclick="sendMessage()">Send</button>
<div id="chat"></div>
<script>
    const connection = new signalR.HubConnectionBuilder()
        .withUrl("/chatHub")
        .build();
    connection.on("ReceiveMessage", function (user, message) {
        const msg = `${user}: ${message}`;
        document.getElementById("chat").innerHTML += `<p>${msg}</p>`;
    });
    connection.start().catch(function (err) {
        return console.error(err.toString());
    });
    function sendMessage() {
        const user = document.getElementById("userInput").value;
        const message = document.getElementById("messageInput").value;
        connection.invoke("Send", user, message).catch(function (err) {
            return console.error(err.toString());
        });
        document.getElementById("messageInput").value = "";
    }
</script>

五、總結(jié)

場景推薦技術(shù)
高性能、低延遲、自定義協(xié)議WebSocket
快速開發(fā)、通用實(shí)時功能SignalR
瀏覽器兼容性要求高SignalR
需要精細(xì)控制通信過程WebSocket

如果你正在開發(fā)一個簡單的聊天室或通知系統(tǒng),SignalR 是更好的選擇;而如果你需要構(gòu)建一個高性能、低延遲的物聯(lián)網(wǎng)通信系統(tǒng),WebSocket 更合適

六、延伸閱讀

到此這篇關(guān)于C# 中 WebSocket 與 SignalR:實(shí)時通信的兩種選擇的文章就介紹到這了,更多相關(guān)C# WebSocket 與 SignalR實(shí)時通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉和重啟計(jì)算機(jī)的示例代碼

    C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉和重啟計(jì)算機(jī)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉和重啟計(jì)算機(jī)的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • 使用WPF實(shí)現(xiàn)一個虛擬鍵盤的代碼示例

    使用WPF實(shí)現(xiàn)一個虛擬鍵盤的代碼示例

    在某些特定場景下,我們可能需要使用虛擬鍵盤來替代實(shí)體鍵盤,本文將詳細(xì)介紹如何使用 WPF 來實(shí)現(xiàn)一個虛擬鍵盤,并監(jiān)控鍵盤輸入,從而達(dá)到完全替代實(shí)體鍵盤的目的,需要的朋友可以參考下
    2025-04-04
  • DOTNETBAR制作圓角窗體和圓角控件代碼實(shí)例

    DOTNETBAR制作圓角窗體和圓角控件代碼實(shí)例

    這篇文章主要介紹了DOTNETBAR制作圓角窗體和圓角控件的方法,大家參考使用吧
    2013-11-11
  • C#中Linq延遲查詢的例子

    C#中Linq延遲查詢的例子

    這篇文章主要介紹了C#中Linq延遲查詢的例子,本文用一個實(shí)例來講解延遲查詢的使用,需要的朋友可以參考下
    2015-06-06
  • c#互斥鎖Mutex類用法介紹

    c#互斥鎖Mutex類用法介紹

    本文詳細(xì)講解了c#互斥鎖Mutex類的用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • WPF中實(shí)現(xiàn)DataGrid行拖拽功能的完整方案

    WPF中實(shí)現(xiàn)DataGrid行拖拽功能的完整方案

    在WPF應(yīng)用開發(fā)中,DataGrid是一個常用的數(shù)據(jù)展示控件,然而,原生的DataGrid并不支持行拖拽功能,這在需要調(diào)整行順序的場景中顯得尤為不便,所以本文將介紹如何實(shí)現(xiàn)一個優(yōu)雅的DataGrid行拖拽功能,需要的朋友可以參考下
    2025-06-06
  • c#中返回文章發(fā)表的時間差的示例

    c#中返回文章發(fā)表的時間差的示例

    現(xiàn)在是2012-12-04 11:29:59,發(fā)表時間是:2012-12-02 21:29:59,傳統(tǒng)的ts.Days因?yàn)橹禐?天14小時0分0秒,會返回“昨天”,而這個會返回“前天”
    2012-12-12
  • C#判斷網(wǎng)站是否能訪問或者斷鏈的方法

    C#判斷網(wǎng)站是否能訪問或者斷鏈的方法

    這篇文章主要介紹了C#判斷網(wǎng)站是否能訪問或者斷鏈的方法,實(shí)例分析了C#判斷網(wǎng)站是否能訪問的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C#與js實(shí)現(xiàn)去除textbox文本框里面重復(fù)記錄的方法

    C#與js實(shí)現(xiàn)去除textbox文本框里面重復(fù)記錄的方法

    這篇文章主要介紹了C#與js實(shí)現(xiàn)去除textbox文本框里面重復(fù)記錄的方法,很實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • Unity 修改FBX模型動畫的操作

    Unity 修改FBX模型動畫的操作

    這篇文章主要介紹了Unity 修改FBX模型動畫的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論

丰顺县| 永新县| 铜川市| 黑水县| 泸定县| 昌吉市| 出国| 泾阳县| 南安市| 塘沽区| 海林市| 项城市| 长岭县| 鄂温| 紫云| 广灵县| 类乌齐县| 建宁县| 陈巴尔虎旗| 绥中县| 巫溪县| 昌吉市| 河间市| 紫金县| 吉隆县| 莒南县| 奇台县| 军事| 休宁县| 封丘县| 丰台区| 喀喇沁旗| 平潭县| 唐河县| 桐城市| 德州市| 浦城县| 辽阳县| 灵宝市| 临清市| 漳平市|