下面就为您详细讲解一下“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技术站