legongju.com
我们一直在努力
2025-01-10 00:10 | 星期五

c#中如何实现消息推送功能

在C#中实现消息推送功能,可以使用WebSocket技术。WebSocket是一种网络通信协议,它允许在客户端和服务器之间建立实时、双向的通信。以下是一个简单的示例,展示了如何在C#中使用WebSocket实现消息推送功能:

  1. 首先,确保你的项目中已经安装了System.Net.WebSockets命名空间。如果没有安装,可以通过NuGet包管理器进行安装:
Install-Package System.Net.WebSockets -Version 4.5.2
  1. 创建一个WebSocket服务器端示例:
using System;
using System.Net;
using System.Net.WebSockets;
using System.Text;
using System.Threading.Tasks;

namespace WebSocketServer
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string uri = "ws://localhost:8080";

            using (var server = new WebSocketServer(uri))
            {
                server.MessageReceived += Server_MessageReceived;
                await server.Start();
                Console.WriteLine("WebSocket server started.");

                Console.ReadLine();
            }
        }

        private static async Task Server_MessageReceived(object sender, WebSocketMessageReceivedEventArgs e)
        {
            WebSocket webSocket = e.WebSocket;
            byte[] buffer = new byte[e.Message.Length];
            await e.Message.ReadAsync(new ArraySegment(buffer), CancellationToken.None);
            string message = Encoding.UTF8.GetString(buffer);

            Console.WriteLine($"Received message: {message}");

            // 广播消息给所有连接的客户端
            await BroadcastMessageAsync(message);
        }

        private static async Task BroadcastMessageAsync(string message)
        {
            byte[] buffer = Encoding.UTF8.GetBytes(message);

            foreach (var webSocket in WebSocketServer.Connections)
            {
                if (webSocket.State == WebSocketState.Open)
                {
                    await webSocket.SendAsync(new ArraySegment(buffer), CancellationToken.None);
                }
            }
        }
    }

    public class WebSocketServer
    {
        private readonly string _uri;
        private readonly List _connections = new List();

        public event EventHandler MessageReceived;

        public WebSocketServer(string uri)
        {
            _uri = uri;
        }

        public async Task Start()
        {
            var listener = new HttpListener();
            listener.Prefixes.Add(_uri);
            listener.OnMessageReceived += Listener_OnMessageReceived;
            listener.Start();

            while (true)
            {
                var context = await listener.AcceptAsync();
                var webSocket = new WebSocket(context);
                _connections.Add(webSocket);

                webSocket.OnMessageReceived += WebSocket_OnMessageReceived;
                webSocket.OnClose += WebSocket_OnClose;

                await webSocket.AcceptAsync();
            }
        }

        private async Task Listener_OnMessageReceived(object sender, HttpListenerContext context)
        {
            var webSocket = new WebSocket(context);
            _connections.Add(webSocket);

            webSocket.OnMessageReceived += WebSocket_OnMessageReceived;
            webSocket.OnClose += WebSocket_OnClose;

            await webSocket.AcceptAsync();
        }

        private async Task WebSocket_OnMessageReceived(object sender, WebSocketMessageReceivedEventArgs e)
        {
            MessageReceived?.Invoke(this, e);
        }

        private async Task WebSocket_OnClose(object sender, WebSocketCloseStatus closeStatus, string reason, bool isTerminated)
        {
            var webSocket = (WebSocket)sender;
            _connections.Remove(webSocket);
        }
    }
}
  1. 创建一个WebSocket客户端示例:
using System;
using System.Net.WebSockets;
using System.Text;
using System.Threading.Tasks;

namespace WebSocketClient
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string uri = "ws://localhost:8080";

            using (var webSocket = new WebSocket(uri))
            {
                webSocket.MessageReceived += WebSocket_MessageReceived;
                await webSocket.ConnectAsync(new Uri(uri), CancellationToken.None);

                Console.WriteLine("Connected to WebSocket server.");

                await SendMessageAsync("Hello, WebSocket server!");

                Console.ReadLine();
            }
        }

        private static async Task WebSocket_MessageReceived(object sender, WebSocketMessageReceivedEventArgs e)
        {
            string message = Encoding.UTF8.GetString(e.Message.ToArray());
            Console.WriteLine($"Received message: {message}");
        }

        private static async Task SendMessageAsync(string message)
        {
            byte[] buffer = Encoding.UTF8.GetBytes(message);
            await webSocket.SendAsync(new ArraySegment(buffer), CancellationToken.None);
        }
    }
}

现在,你可以分别运行WebSocket服务器端和客户端示例。当客户端连接到服务器并发送一条消息时,服务器会将接收到的消息广播给所有连接的客户端。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/77536.html

相关推荐

  • C++中的option类型是什么

    C++中的option类型是什么

    在 C++ 中,没有内置的 Option 类型,但是你可以使用一些库或者自定义类来实现类似的功能。Option 类型通常用于表示一个值可能存在也可能不存在,这在 Rust 等语...

  • 如何测试C++ table的正确性和稳定性

    如何测试C++ table的正确性和稳定性

    要测试C++表(假设是一个数据结构,如vector、list或自定义类)的正确性和稳定性,可以遵循以下步骤: 编写测试用例:首先,需要为表编写一组测试用例,这些用例...

  • table在C++图形界面编程中的应用

    table在C++图形界面编程中的应用

    在C++图形界面编程中,table(表格)是一种常见的组件,用于以行和列的形式显示数据。它可以帮助用户更好地组织和查看数据。C++本身没有内置的图形界面库,但可以...

  • C++ table与数据库的交互方式

    C++ table与数据库的交互方式

    在C++中,与数据库进行交互通常需要使用数据库连接库。这些库允许你在C++程序中执行SQL查询并处理结果。以下是一些常见的数据库连接库和交互方式: MySQL: 使用M...

  • pycharm如何助力c#的敏捷开发

    pycharm如何助力c#的敏捷开发

    PyCharm主要是为Python开发设计的集成开发环境(IDE),它提供了丰富的功能来支持Python语言的敏捷开发。然而,对于C#语言,PyCharm并不是一个直接的选择。C#通常...

  • c#项目在pycharm中的部署流程是什么

    c#项目在pycharm中的部署流程是什么

    在PyCharm中部署C#项目需要使用.NET Core或者.NET 5(或更高版本)来构建和运行C#代码。以下是在PyCharm中部署C#项目的步骤: 安装.NET Core或.NET 5 SDK:首先,...

  • 如何用c#实现flash的动态加载

    如何用c#实现flash的动态加载

    在C#中实现Flash的动态加载并不是一个直接的过程,因为Flash技术已经被淘汰,大多数现代浏览器都不再支持Flash。Adobe Flash Player已于2020年底停止支持,这意味...

  • c#中flash的资源管理怎样进行

    c#中flash的资源管理怎样进行

    在C#中,Flash资源管理主要涉及到两个方面:一是与Flash播放器相关的资源管理,二是与Flash内容(如SWC文件)相关的资源管理。由于Flash技术已经逐渐被淘汰,我将...