.net core 6 websocket聊天功能开发,包含群聊私聊
时间: 2024-02-01 09:14:38 浏览: 27
好的,下面是一个简单的 .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 聊天应用程序示例,包含了群聊和私聊功能。