C#简单实现Websocket

好的,让我们来实现一个简单的 WebSocket 客户端和服务器端通信的应用程序,需要使用 C# 和 Visual Studio 2022。

首先,我们需要创建一个空的 ASP.NET Core Web Application 项目并将其命名为“WebSocketDemo”。在 Visual Studio 2022 中,选择“文件”菜单,然后选择“新建”和“项目”。

在“新建项目”窗口中,选择“ASP.NET Core Web 应用程序”并单击“下一步”。

然后,选择“Web 应用程序”模板并将应用程序命名为“WebSocketDemo”。单击“创建”按钮创建项目。

接下来,我们需要在项目中引入WebSocket相关的库。在Visual Studio 2022中,打开“解决方案资源管理器”,右键点击“WebSocketDemo”项目,选择“管理NuGet程序包”。

在“NuGet包管理器”中搜索“Microsoft.AspNetCore.WebSockets”,选择“Microsoft.AspNetCore.WebSockets”并安装它。

安装完成后,我们需要添加一个 WebSocketController 来处理客户端和服务器端的通信。在项目的 Controllers 目录下,添加一个名为 “WebSocketController.cs”的控制器。以下是示例代码:


using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.WebSockets;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;

namespace WebSocketDemo.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WebSocketController : ControllerBase
    {
        private readonly WebSocketHandler _webSocketHandler;

        public WebSocketController(WebSocketHandler webSocketHandler)
        {
            _webSocketHandler = webSocketHandler;
        }

        [HttpGet("/{id}")]
        public async Task Get(string id)
        {
            if (HttpContext.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync();
                _webSocketHandler.OnConnected(id, webSocket);
                await _webSocketHandler.Receive(webSocket, async (result, buffer) =>
                {
                    if (result.MessageType == WebSocketMessageType.Text)
                    {
                        await _webSocketHandler.OnMessage(id, result, buffer);
                    }
                    else if (result.MessageType == WebSocketMessageType.Close)
                    {
                        await _webSocketHandler.OnDisconnected(id, webSocket);
                    }
                });
            }
            else
            {
                HttpContext.Response.StatusCode = 400;
            }
        }
    }

    public class WebSocketHandler
    {
        public async Task OnConnected(string id, WebSocket webSocket)
        {
            // 处理新的连接
        }

        public async Task Receive(WebSocket webSocket, System.Func<WebSocketReceiveResult, byte[], Task> handleMessage)
        {
            var buffer = new byte[1024 * 4];
            while (webSocket.State == WebSocketState.Open)
            {
                var result = await webSocket.ReceiveAsync(new System.ArraySegment<byte>(buffer), CancellationToken.None);
                await handleMessage(result, buffer);
            }
        }

        public async Task OnMessage(string id, WebSocketReceiveResult result, byte[] buffer)
        {
            // 处理消息
        }

        public async Task OnDisconnected(string id, WebSocket webSocket)
        {
            // 处理连接断开
        }
    }
}

在代码中,我们提供了一个 WebSocketController, 用于处理客户端的请求。在 Get 方法中,我们检查当前接受的请求是否是 WebSocket 请求。如果是,在 OnConnected 方法中将 WebSocket 添加到 WebSocketHandler 的连接列表中。

然后,在 Receive 方法中获取连接的数据,通过 OnMessage 处理收到的消息,并在 OnDisconnected 方法中删除 WebSocket 连接。

请注意,这里的 WebSocketHandler 可以添加更多逻辑和方法,以处理从客户端接收到的不同数据。

最后,我们需要在 Startup.cs 文件中注册 WebSocket 相关依赖项。在 ConfigureServices 方法中,将以下代码添加到 services.AddControllers() 之后。

services.AddWebSocketManager();

然后,为 WebSocketHandler 添加服务:

services.AddSingleton<WebSocketHandler>();

最后,在 Configure 方法中,添加以下代码:

app.UseWebSockets();
app.MapWebSocketManager("/ws", serviceProvider.GetService<WebSocketHandler>());

此代码使用 UseWebSocket 和 MapWebSocketManager 方法将 WebSocketHandler 实例挂钩到WebSocket 请求的 WebSocket 路径(‘ws’)上。完成后,项目准备好进行测试!

运行应用程序后,您可以使用任何现代浏览器作为 WebSocket 客户端并连接到您的服务器(例如,可以使用 Chrome、Firefox 或 Edge)。如要进行测试,可以使用 JavaScript 中的 WebSocket API, 可以使用以下代码:

const socket = new WebSocket('ws://localhost:5000/ws/123')
socket.addEventListener('open', (event) => {
    console.log('WebSocket connected')
})
socket.addEventListener('message', (event) => {
    console.log(`Message: ${event.data}`)
})
socket.send('Hello, WebSocket!')

这里的 ‘ws://localhost:5000/ws/123’ 中,最后的 /123 是一个自定义值,为WebSocket客户端提供了一个身份标识。您可以随意更改此值或使用不同的标识符。

在浏览器中打开开发者工具并在控制台中执行上面的代码,您将看到消息“Hello, WebSocket!”通过您的 WebSocket 连接发送到服务器。将 WebSocketController.cs 的 OnMessage 方法中的代码替换为以下内容,可以回复上面发送的消息。


await webSocket.SendAsync(buffer, result.MessageType, true, CancellationToken.None);

这就是一个简单的 WebSocket 客户端和服务器端通信的应用程序,您可以在此基础上进一步进行扩展。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Visual Studio 2017是一个非常强大的开发工具,它支持各种编程语言和平台,并提供了丰富的功能和工具来简化开发流程。其中,创建Websocket服务器也是其中之一。 Websocket是一种全双工通讯协议,可以实现实时通信和数据推送。通过创建Websocket服务器,我们可以在客户端和服务器之间建立一条持久化的连接,实现实时通信和数据传输。 在Visual Studio 2017中,创建Websocket服务器非常简单。首先,我们需要创建一个ASP.NET Core Web应用程序项目。在新建项目的窗口中,选择“ASP.NET Core Web应用程序”并命名你的项目。接下来,选择“Web应用程序”或“Web API”模板,再选择“空”模板。 然后,在项目中添加一个“Microsoft.AspNetCore.WebSockets”NuGet软件包,它是ASP.NET Core Web应用程序的Websocket功能的核心。通过这个NuGet软件包,我们可以轻松地创建一个Websocket服务器,处理Websocket连接和消息。 最后,我们需要在Startup.cs文件中添加Websocket中间件。在Configure方法中,添加以下代码: app.UseWebSockets(); app.Use(async (context, next) => { if (context.WebSockets.IsWebSocketRequest) { WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); await HandleWebSocket(webSocket); } else { await next(); } }); 这样,我们就创建了一个简单Websocket服务器,并实现Websocket连接和消息的处理功能。我们可以通过其他工具或应用程序来测试和使用这个Websocket服务器。 ### 回答2: VS2017可以创建WebSocket服务器,这是一种基于Web的服务协议,可以实现客户端和服务器之间的双向通信。实现WebSocket服务器需要先选择一个支持WebSocket协议的Web开发框架,如SignalR或SuperSocket等。 接下来,我们需要在VS2017中创建一个新的ASP.NET Core Web应用程序,选择Web应用程序模板,并勾选使用Https。然后,在项目中添加WebSocket支持,我们需要在Startup.cs文件中添加WebSocket中间件和WebSocket处理程序。 在Websocket处理程序中,我们可以定义服务器和客户端之间的交互逻辑,例如接收客户端发来的消息、向客户端发送消息等。 最后,编译并启动服务,此时我们的WebSocket服务器已经创建成功。可以使用WebSocket客户端应用程序,如浏览器插件或C#代码等进行测试和验证。 需要注意的是,WebSocket服务器与HTTP服务器不同,在运行时需要保持持久连接,因此需要保证服务器稳定性和安全性,避免出现内存泄漏、拒绝服务攻击等安全问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值