C# 中使用 WebSocket 的技术探索

 

目录

一、WebSocket 基础

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

三、在 C# 中实现 WebSocket 客户端

四、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 的应用场景广泛,特别适用于需要实时数据交互的应用程序。

引入地址 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#提供了WebSocket类库,可以方便地实现WebSocket协议的通信。下面是一个简单的示例: ```csharp using System; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { using (var client = new ClientWebSocket()) { var uri = new Uri("ws://localhost:8080/ws"); await client.ConnectAsync(uri, CancellationToken.None); var sendBytes = new byte[] { 0x01, 0x02, 0x03 }; await client.SendAsync(new ArraySegment<byte>(sendBytes), WebSocketMessageType.Binary, true, CancellationToken.None); var receiveBuffer = new byte[1024]; while (client.State == WebSocketState.Open) { var receiveResult = await client.ReceiveAsync(new ArraySegment<byte>(receiveBuffer), CancellationToken.None); if (receiveResult.MessageType == WebSocketMessageType.Close) { await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None); } else { var messageBytes = new byte[receiveResult.Count]; Array.Copy(receiveBuffer, messageBytes, receiveResult.Count); Console.WriteLine($"Received: {BitConverter.ToString(messageBytes)}"); } } } } } ``` 在这个示例,我们首先创建了一个`ClientWebSocket`实例,并使用`ConnectAsync`方法连接到WebSocket服务器。然后,我们使用`SendAsync`方法发送一个二进制消息。接下来,我们开启一个循环,不断接收来自WebSocket服务器的消息,并将它们打印到控制台上。最后,我们在循环检查WebSocket的状态,如果状态为`WebSocketState.Open`,则继续接收消息;否则,我们调用`CloseAsync`方法关闭WebSocket连接。 需要注意的是,在实际使用,我们需要处理`WebSocketException`和`OperationCanceledException`等异常。此外,我们还可以使用`WebSocketReceiveResult.EndOfMessage`属性来检查是否接收到了完整的消息,以及使用`WebSocketCloseStatus`枚举来指定WebSocket关闭的状态码和原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值