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日

相关文章

  • C#实现带消息数的App图标

    下面就为大家介绍一下如何用C#实现带消息数的App图标的步骤。 1. 准备工作 首先,你需要创建一个Windows Forms应用程序。然后,从CustomControls目录(你需要从NuGet中安装此组件)中添加一个NotifyIcon控件并将其拖放到你的主窗体中。 2. 实现带消息数的App图标 要实现带消息数的App图标,我们需要设置NotifyIc…

    C# 2023年6月1日
    00
  • C#实现串口调试工具

    下面是关于C#实现串口调试工具的完整攻略: 1. 前期准备 在使用C#来实现串口调试工具之前,首先要准备好相关的环境和工具。具体的步骤如下: 安装Visual Studio开发工具,选择适合自己的版本。 新建一个项目,选择“Windows窗体应用程序”。 在项目中添加“串口”控件。 2. 界面设计 接下来要进行的步骤是对调试工具的界面进行设计。通过界面设计,…

    C# 2023年6月6日
    00
  • 在ASP.NET 2.0中操作数据之七十三:用Managed Code创建存储过程和用户自定义函数(上部分)

    在ASP.NET 2.0中操作数据之七十三:用Managed Code创建存储过程和用户自定义函数(上部分) Managed Code是指能够在托管代码环境中运行的代码,与之相对的是Unmanaged Code,需要依赖于操作系统底层的API和COM组件等,而且不受托管代码环境控制,容易引起内存泄漏等问题。本文将介绍如何使用Managed Code创建存储过…

    C# 2023年5月31日
    00
  • C#格式化数字字符串的方法

    下面我将为你详细讲解如何在C#中格式化数字字符串的方法。 使用ToString方法格式化数字字符串 在C#中,我们可以使用ToString方法来将数字格式化为字符串。该方法有许多重载,可以用于格式化不同类型的数字,下面是一些常见的用法。 1. 格式化整数 对于整数类型,可以使用ToString方法的重载形式来指定需要的格式,例如: int num = 123…

    C# 2023年5月15日
    00
  • C#利用DesignSurface如何实现简单的窗体设计器

    使用DesignSurface是C#实现简单窗体设计器的一种方式,下面是详细的攻略: 步骤一:添加DesignSurface组件 首先,我们需要在Visual Studio中创建一个C#控制台应用程序,然后选择“工具”菜单下的“NuGet包管理器”来添加DesignSurface组件。在弹出的“NuGet包管理器”窗口中搜索“System.Component…

    C# 2023年6月6日
    00
  • 深入理解C#之继承

    深入理解C#之继承 继承是面向对象编程中非常重要的一种机制,它可以使得我们代码重用性更高,更加简洁。在C#中,继承可以通过类之间的关系来实现(类之间的关系有继承、实现、组合等)。在本篇文章中,我们将学习C#中的继承机制,重点包括如下内容: 继承的语法和基本概念 虚方法和抽象类 接口继承 隐藏和重写方法 继承链 继承的语法和基本概念 在C#中,使用:符号表示一…

    C# 2023年5月15日
    00
  • C# web应用程序不能访问app_code下类的原因以及解决方法

    问题描述: 在 C# web 应用程序中,有时候会遇到一个问题,当我们把一些公共的类、控件或者数据访问层的代码放在 App_Code 目录下时,编译时会报错,提示某些命名空间或者模块不存在。 产生原因: 这个问题产生的根本原因是 ASP.NET 应用程序编译的方式不同于普通的 C# 应用程序。一般情况下,编译器会首先编译 App_Code 下面的代码,然后才…

    C# 2023年5月31日
    00
  • C#实现异步的常用方式总结

    让我来详细讲解一下“C#实现异步的常用方式总结”的完整攻略。 异步编程简介 在 C# 中,我们使用异步编程来执行长时间运行的操作,以便不会阻塞主线程。异步编程可以在不使用多线程的情况下实现并发性,并且能够改善应用程序的响应性能。 C# 实现异步的常用方式 C# 实现异步的常用方式主要有以下方式: 1.使用 Task 和 async/await Task 和 …

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