C#用websocket实现简易聊天功能(服务端)

下面就为您详细讲解一下“C#用websocket实现简易聊天功能(服务端)”的完整攻略。

1. 前置条件

在开始撰写聊天功能代码之前,需要我们先完成以下的前置条件:

1.1 安装WebSocket依赖

我们需要利用NuGet安装Windows凭据库依赖、WebSocket依赖。在Visual Studio编辑器的“解决方案资源管理器”中,右键单击项目名称,点击“管理NuGet程序包”打开NuGet包管理器,然后使用以下命令行安装:

Install-Package Microsoft.AspNet.SignalR.SystemWeb -Version 2.4.1
Install-Package Microsoft.AspNet.WebSockets -Version 1.0.0

1.2 引入命名空间

我们需要在代码相关处引入命名空间“System.Net.WebSockets”,即:

using System.Net.WebSockets;

1.3 编写代码

前置条件检查完成后,我们可以开始撰写聊天功能代码了。

2. 编写代码

2.1 建立WebSocket连接

我们需要先建立WebSocket连接,连接成功后才能发送/接收消息,在构造函数中完成WebSocket的建立。代码如下:

private async Task ConnectWebSocket(CancellationToken cancellationToken)
{
    var webSocketContext = await _httpListener.GetContextAsync();
    if (webSocketContext.Request.IsWebSocketRequest)
    {
        var webSocket = await webSocketContext.AcceptWebSocketAsync(null);

        await SendMessage($"Client { _clientId } is connected.", cancellationToken); // 接受连接并向客户端发送连接确认消息

        await ReceiveMessage(webSocket, cancellationToken);
    }
}

2.2 发送消息

我们可以利用WebSocket发送聊天信息到服务器。在发送消息的方法中,我们可以对消息进行异步序列化,并添加消息头用于区分协议。代码如下:

private async Task SendMessage(string message, CancellationToken cancellationToken)
{
    // 需要处理的逻辑封装在using块中,用于释放资源
    using(var outStream = new MemoryStream())
    using (var writer = new BinaryWriter(outStream)
    {
        writer.Write((byte)MessagePrefix.ChatMessage);
        writer.Write(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new { UserName = _username, Message = message })));
        outStream.Seek(0, SeekOrigin.Begin);

        await _webSocket.SendAsync(new ArraySegment<byte>(outStream.ToArray()), WebSocketMessageType.Binary, true, cancellationToken);
    }
}

2.3 接收消息

我们需要在客户端向服务器发送聊天数据,服务器通过Websocket接收数据,并将数据转化成ServerMessage模型。代码如下:

private async Task ReceiveMessage(WebSocket webSocket, CancellationToken cancellationToken)
{
    while (webSocket.State == WebSocketState.Open)
    {
        using (var inputStream = new MemoryStream())
        {
            // 接收到服务器的消息
            var buffer = new byte[4096];

            WebSocketReceiveResult result;
            do
            {
                result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
                inputStream.Write(buffer, 0, result.Count);

            } while (!result.EndOfMessage);

            inputStream.Seek(0, SeekOrigin.Begin);

            if (result.MessageType == WebSocketMessageType.Close)  // 关闭Websocket连接
                await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, cancellationToken);

            using (var reader = new BinaryReader(inputStream))
            {
                var messageType = reader.ReadByte();
                switch (messageType)
                {
                    case (byte)MessagePrefix.ChatMessage:   // 处理聊天消息
                        var chatMessage = JsonConvert.DeserializeObject<ChatMessage>(Encoding.UTF8.GetString(reader.ReadBytes((int)(inputStream.Length - 1))));
                        await SendMessage($"[{chatMessage.UserName}]:{chatMessage.Message}", cancellationToken);
                        break;
                    default:
                        await SendMessage($"未预料到的协议: {messageType}", cancellationToken);
                        break;
                }
            }
        }
    }
}

以上就是本次“C#用websocket实现简易聊天功能(服务端)”的攻略分享,希望对您有所帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#用websocket实现简易聊天功能(服务端) - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • .NET 日志系统设计思路及实现代码

    概述 在.NET应用程序的开发过程中,日志系统往往是必不可少的一环。良好的日志系统可以帮助我们更快速地发现问题所在,提高应用程序的质量。本攻略主要讲解在.NET应用程序中设计日志系统的思路及实现代码。 设计思路 在设计.NET日志系统时,我们需要考虑以下几个方面: 级别设置:一般来说,我们需要将日志分为不同的级别,例如debug、info、warn、erro…

    C# 2023年5月31日
    00
  • C# Winform程序实现防止多开的方法总结【亲测】

    C# Winform程序实现防止多开的方法总结【亲测】 当我们同事启动我们编写的C# Winform程序时,有时会发现一个很尴尬的问题,同事同时启动了多个程序。这会给我们的程序带来一些问题,如系统资源的浪费等。因此,为了解决这个问题,我们有必要实现一个防止多开的功能。在本文中,我将介绍三种解决方案。 解决方案一:记录程序运行状态 为了能判断程序是否正在运行中…

    C# 2023年6月7日
    00
  • asp.net Web Services上传和下载文件(完整代码)第1/2页

    首先,我们需要了解ASP.NET Web Services是什么。ASP.NET Web Services是一种基于Web的应用程序,允许两个不同的应用程序在互联网上进行通信。它们使用标准的XML消息格式进行通信,可以通过HTTP传输,无需使用编程语言或操作系统进行协调。在这篇文章中,我们将学习如何使用ASP.NET Web Services上传和下载文件。…

    C# 2023年5月31日
    00
  • c#设计模式之单例模式的实现方式

    C#设计模式之单例模式的实现方式 什么是单例模式 单例模式是设计模式的一种,它保证在整个应用程序生命周期中只能有一个实例被创建和访问,并且这个实例是全局唯一的。在需要频繁创建和销毁对象时,单例模式可以提高程序的性能和可维护性。 单例模式的实现方式 在 C# 中,单例模式有多种实现方式,如下: 第一种:懒汉式单例模式 使用懒汉式单例模式,在第一次调用 GetI…

    C# 2023年6月6日
    00
  • ASP.NET编程简单实现生成静态页面的方法【附demo源码下载】

    为了更好地讲解“ASP.NET编程简单实现生成静态页面的方法”,我们需要分为以下几个部分进行详细讲解: 为什么需要生成静态页面? 静态页面生成的基本思路和流程 实现过程和示例说明 1. 为什么需要生成静态页面? 当我们访问一个网站时,实际上每一次访问都需要服务器去动态生成页面并将结果返回给浏览器。但是,当网站的访问量很大时,频繁地动态生成页面会极大地消耗服务…

    C# 2023年5月31日
    00
  • Linux上使用Docker部署ASP.NET Core应用程序

    在 Linux 上使用 Docker 部署 ASP.NET Core 应用程序是一种常见的部署方式,可以提高应用程序的可移植性和可扩展性。以下是 Linux 上使用 Docker 部署 ASP.NET Core 应用程序的完整攻略: 步骤一:创建 ASP.NET Core 应用程序 首先,需要创建一个 ASP.NET Core 应用程序。可以使用以下命令在 …

    C# 2023年5月17日
    00
  • 如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)

    根据百度地图计算两地之间的驾驶距离,我们可以使用百度地图API中的“驾车路线规划”功能来实现。此功能需要使用开放平台提供的开发工具包,支持JavaScript和C#两种语言。 使用JavaScript实现计算距离 1. 引入百度地图API <script type=”text/javascript” src=”http://api.map.baidu.…

    C# 2023年6月6日
    00
  • C# CancellationToken和CancellationTokenSource的用法详解

    C# CancellationToken 和 CancellationTokenSource 用法详解 CancellationToken 和 CancellationTokenSource 是 C# 中用于取消异步操作的机制。本篇攻略将详细讲解这两个类的用法。 CancellationTokenSource CancellationTokenSource …

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部