推荐一个.Net Core开发的Websocket群聊、私聊的开源项目

今天给大家推荐一个使用Websocket协议实现的、高性能即时聊天组件,可用于群聊、好友聊天、游戏直播等场景。

项目简介

这是一个基于.Net Core开发的、简单、高性能的通讯组件,支持点对点发送、群聊、在线状态的订阅。

该项目还包含群聊例子,可以用于学习。

技术架构

1、跨平台:基于.NetCore开发,支持Windows、Mono、Liunx、Windows Azure、Docker。

2、支持 .NetCore 6.0+。

3、组件:Redis。

组件功能

1、点对点通讯;

2、是否在线获取,以及在线状态订阅;

3、加入频道、离开频道、获取在线人数、清理未在线的客户端、获取客户加入的所有频道、发送群聊消息。

项目结构

FreeIM为通讯组件,ImServer为服务端、WebApi为群聊前端。

使用例子

服务端

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    Console.OutputEncoding = Encoding.GetEncoding("GB2312");
    Console.InputEncoding = Encoding.GetEncoding("GB2312");

    app.UseDeveloperExceptionPage();

    app.UseFreeImServer(new ImServerOptions
    {
        Redis = new FreeRedis.RedisClient(Configuration["ImServerOption:RedisClient"]),
        Servers = Configuration["ImServerOption:Servers"].Split(";"),
        Server = Configuration["ImServerOption:Server"]
    });
}

配置信息

"ImServerOption": {
//Reidis地址
"RedisClient": "127.0.0.1:6379,poolsize=10",
  //集群地址,可以配置多个
"Servers": "127.0.0.1:6001",
  //服务端地址
"Server": "127.0.0.1:6001"
}

群聊客户端

public void Configure(IApplicationBuilder app)
{
    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
    Console.OutputEncoding = Encoding.GetEncoding("GB2312");
    Console.InputEncoding = Encoding.GetEncoding("GB2312");

    app.UseDeveloperExceptionPage();

    app.UseRouting();
    app.UseEndpoints(config => config.MapControllers());
    app.UseDefaultFiles();
    app.UseStaticFiles();

    //Redis、服务端地址
    ImHelper.Initialization(new ImClientOptions
    {
        Redis = new FreeRedis.RedisClient("127.0.0.1:6379,poolsize=10"),
        Servers = new[] { "127.0.0.1:6001" }
    });

    ImHelper.Instance.OnSend += (s, e) => 
        Console.WriteLine($"ImClient.SendMessage(server={e.Server},data={JsonConvert.SerializeObject(e.Message)})");
    //发送消息
    ImHelper.EventBus(
        t =>
        {
            Console.WriteLine(t.clientId + "上线了");
            var onlineUids = ImHelper.GetClientListByOnline();
            ImHelper.SendMessage(t.clientId, onlineUids, $"用户{t.clientId}上线了");
        }, 
        t => Console.WriteLine(t.clientId + "下线了"));
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的 .NET Core 6 WebSocket 天应用程序示例,包含了群功能: 1. 创建 ASP.NET Core 6 Web 应用程序 首先,我们需要创建一个 ASP.NET Core 6 Web 应用程序。可以使用 Visual Studio 或者 Visual Studio Code 来创建。 2. 安装 Microsoft.AspNetCore.WebSockets 包 在项目中安装 Microsoft.AspNetCore.WebSockets 包,使用以下命令: ``` dotnet add package Microsoft.AspNetCore.WebSockets ``` 3. 创建 WebSocket 控制器 创建一个名为 ChatController 的控制器,并添加以下代码: ```csharp using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.WebSockets; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; namespace WebSocketChat.Controllers { [Route("api/[controller]")] [ApiController] public class ChatController : ControllerBase { private readonly WebSocketManager _webSocketManager; public ChatController(WebSocketManager webSocketManager) { _webSocketManager = webSocketManager; } [HttpGet("{username}")] public async Task Get(string username, CancellationToken cancellationToken) { if (HttpContext.WebSockets.IsWebSocketRequest) { WebSocket webSocket = await HttpContext.WebSockets.AcceptWebSocketAsync(); var socketConnection = new SocketConnection(username, webSocket); _webSocketManager.AddSocket(socketConnection); await socketConnection.ReceiveAsync(_webSocketManager, cancellationToken); } else { HttpContext.Response.StatusCode = 400; } } } } ``` 这个控制器包含了 WebSocket 连接的处理逻辑。它从 HTTP 上下文中获取 WebSocket 对象,然后创建一个 SocketConnection 对象来处理连接。接下来,将 SocketConnection 对象添加到 WebSocketManager 中,以便以后可以使用。 4. 创建 WebSocketManager 和 SocketConnection 类 创建一个名为 WebSocketManager 的类,表示所有 WebSocket 连接的集合。还需要创建名为 SocketConnection 的类,表示单个 WebSocket 连接。 ```csharp using System.Collections.Concurrent; using System.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace WebSocketChat { public class WebSocketManager { private ConcurrentDictionary<string, SocketConnection> _sockets = new ConcurrentDictionary<string, SocketConnection>(); public void AddSocket(SocketConnection socket) { _sockets.TryAdd(socket.Username, socket); } public void RemoveSocket(string username) { _sockets.TryRemove(username, out _); } public async Task SendMessageAsync(string username, string message) { if (_sockets.TryGetValue(username, out var socket)) { await socket.SendAsync(message); } } public async Task BroadcastAsync(string message) { foreach (var socket in _sockets.Values) { await socket.SendAsync(message); } } } public class SocketConnection { public string Username { get; } public WebSocket WebSocket { get; } public SocketConnection(string username, WebSocket webSocket) { Username = username; WebSocket = webSocket; } public async Task ReceiveAsync(WebSocketManager webSocketManager, CancellationToken cancellationToken) { var buffer = new byte[1024 * 4]; while (WebSocket.State == WebSocketState.Open) { var result = await WebSocket.ReceiveAsync(new ArraySegment<byte>(buffer), cancellationToken); if (result.MessageType == WebSocketMessageType.Text) { var message = Encoding.UTF8.GetString(buffer, 0, result.Count); var index = message.IndexOf(':'); if (index != -1) { var toUser = message.Substring(0, index); var content = message.Substring(index + 1); await webSocketManager.SendMessageAsync(toUser, $"{Username}: {content}"); } else { await webSocketManager.BroadcastAsync($"{Username}: {message}"); } } else if (result.MessageType == WebSocketMessageType.Close) { await WebSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, cancellationToken); webSocketManager.RemoveSocket(Username); } } } public async Task SendAsync(string message) { var bytes = Encoding.UTF8.GetBytes(message); var buffer = new ArraySegment<byte>(bytes); await WebSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); } } } ``` WebSocketManager 类维护了所有 WebSocket 连接的集合,并提供了一些方法来发送消息。SocketConnection 类表示单个 WebSocket 连接,它维护了连接的用户名和 WebSocket 对象。 5. 创建天页面 最后,我们需要创建一个天页面,让用户可以在其中输入天消息。可以使用 HTML 和 JavaScript 来创建这个页面。 ```html <!DOCTYPE html> <html> <head> <title>WebSocket Chat</title> </head> <body> <h1>WebSocket Chat</h1> <div> <input type="text" id="username" placeholder="Enter your username"> <button onclick="connect()">Connect</button> </div> <div> <input type="text" id="toUser" placeholder="Enter recipient (optional)"> <input type="text" id="message" placeholder="Enter message"> <button onclick="send()">Send</button> </div> <div> <ul id="messages"></ul> </div> <script> var socket; function connect() { var username = document.getElementById("username").value; var url = "ws://" + window.location.host + "/api/chat/" + username; socket = new WebSocket(url); socket.onmessage = function (event) { var messages = document.getElementById("messages"); var li = document.createElement("li"); li.textContent = event.data; messages.appendChild(li); }; } function send() { var toUser = document.getElementById("toUser").value; var message = document.getElementById("message").value; if (toUser) { message = toUser + ":" + message; } socket.send(message); } </script> </body> </html> ``` 这个页面包含了一个表单,让用户输入他们的用户名和天消息。当用户单击 Connect 按钮时,将会创建一个 WebSocket 连接。当用户单击 Send 按钮时,将会向服务器发送天消息。 以上就是一个简单的 .NET Core 6 WebSocket 天应用程序示例,包含了群功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野生的狒狒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值