C# 中使用 WebSocket 的技术探索

WebSocket 是一种网络通信协议,提供了浏览器和服务器之间的全双工通信渠道。与传统的 HTTP 请求相比,WebSocket 允许服务器主动发送信息给客户端,实现真正的实时双向交互。在 C# 中,我们可以使用 .NET Framework 或 .NET Core 来实现 WebSocket 通信。本文将深入探讨在 C# 中如何使用 WebSocket 进行开发。

一、WebSocket 基础

WebSocket 协议通过单个长连接实现客户端与服务器之间的全双工通讯。这意味着客户端和服务器之间的数据交换可以随时发起,非常适合需要高频更新的应用程序,如在线游戏、聊天应用、实时通知等。

二、在 C# 中实现 WebSocket 服务器

在 .NET Core 中,我们可以使用 System.Net.WebSockets 命名空间来创建一个 WebSocket 服务器。以下是一个简单的 WebSocket 服务器实现:

using System;
using System.Net;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;

public class WebSocketServer
{
    private const int Port = 8080;

    public static async Task Main(string[] args)
    {
        var httpListener = new HttpListener();
        httpListener.Prefixes.Add($"http://*:{Port}/");
        httpListener.Start();
        Console.WriteLine("WebSocket 服务器启动,监听端口:" + Port);

        while (true)
        {
            var context = await httpListener.GetContextAsync();
            if (context.Request.IsWebSocketRequest)
            {
                ProcessRequest(context);
            }
            else
            {
                context.Response.StatusCode = 400;
                context.Response.Close();
            }
        }
    }

    private static async void ProcessRequest(HttpListenerContext context)
    {
        WebSocketContext wsContext;
        try
        {
            wsContext = await context.AcceptWebSocketAsync(subProtocol: null);
        }
        catch (Exception ex)
        {
            context.Response.StatusCode = 500;
            context.Response.Close();
            Console.WriteLine($"无法建立 WebSocket 连接:{ex}");
            return;
        }

        WebSocket webSocket = wsContext.WebSocket;
        try
        {
            byte[] buffer = new byte[1024];
            while (webSocket.State == WebSocketState.Open)
            {
                var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
                if (result.MessageType == WebSocketMessageType.Text)
                {
                    Console.WriteLine($"收到消息:{System.Text.Encoding.UTF8.GetString(buffer, 0, result.Count)}");
                    await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), WebSocketMessageType.Text, true, CancellationToken.None);
                }
                else if (result.MessageType == WebSocketMessageType.Close)
                {
                    await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
                }
            }
        }
        catch (Exception ex)
        {
            if (webSocket.State == WebSocketState.Open)
            {
                await webSocket.CloseAsync(WebSocketCloseStatus.InternalServerError, "内部服务器错误", CancellationToken.None);
            }
            Console.WriteLine($"WebSocket 连接异常:{ex}");
        }
    }
}
三、在 C# 中实现 WebSocket 客户端

同样,在 C# 中创建一个 WebSocket 客户端也非常简单。以下是一个简单的 WebSocket 客户端示例:

using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

public class WebSocketClient
{
    private const string Uri = "ws://localhost:8080/";

    public static async Task Main(string[] args)
    {
        using (var ws = new ClientWebSocket())
        {
            await ws.ConnectAsync(new Uri(Uri), CancellationToken.None);
            Console.WriteLine("WebSocket 客户端已连接");

            string message = "Hello, WebSocket!";
            byte[] buffer = Encoding.UTF8.GetBytes(message);
            await ws.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, CancellationToken.None);

            Console.WriteLine("发送消息:" + message);

            buffer = new byte[1024];
            var result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
            Console.WriteLine($"收到消息:{Encoding.UTF8.GetString(buffer, 0, result.Count)}");

            await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None);
        }
    }
}
四、WebSocket 的应用场景

WebSocket 适用于需要实时数据交互的应用场景,如:

  1. 在线游戏:玩家之间的实时交互。

  2. 聊天应用:实时消息传递。

  3. 金融交易:实时股票价格更新。

  4. 实时通知:如新闻更新、社交媒体动态等。

五、总结

WebSocket 提供了一种在客户端和服务器之间进行全双工通信的有效方式。在 C# 中,我们可以使用 .NET Core 或 .NET Framework 轻松地实现 WebSocket 服务器和客户端。WebSocket 的应用场景广泛,特别适用于需要实时数据交互的应用程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值