几个月前,有同事来找我,问能否用 .NET 创建一个简单的 WebSocket 服务器(以及之后的客户端)。据我了解,他想用它来控制对方电脑上的进程。或许对其他人也有用,所以我把它发布在这里。
让我们从服务器开始。我这里使用的是 .NET 6 和 ASP.NET Core,不需要任何额外的配置。它实际上是一个准系统应用程序,没有任何花哨的附加功能。
Console.Title = "Server";
var builder = WebApplication.CreateBuilder();
builder.WebHost.UseUrls("http://localhost:6666");
var app = builder.Build();
app.UseWebSockets();
app.Map("/ws", async context =>
{
if (context.WebSockets.IsWebSocketRequest)
{
using (var webSocket = await context.WebSockets.AcceptWebSocketAsync())
{
while (true)
{
await webSocket.SendAsync(Encoding.ASCII.GetBytes($"Test - {DateTime.Now}"), WebSocketMessageType.Text, true, CancellationToken.None);
await Task.Delay(1000);
}
}
}
else
{
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
}
});
await app.RunAsync();
端点/ws是 WebSocket 通信发生的地方,在这种情况下,$"Test - {DateTime.Now}"每秒只需发送一个字符串。
客户端同样简单。只需打开连接(无需任何错误处理😎)并读取预定义的固定缓冲区(在现实世界中,使用EndOfMessage属性是个好主意),直到连接关闭。
Console.Title = "Client";
using (var ws = new ClientWebSocket())
{
await ws.ConnectAsync(new Uri("ws://localhost:6666/ws"), CancellationToken.None);
var buffer = new byte[256];
while (ws.State == WebSocketState.Open)
{
var result = await ws.ReceiveAsync(buffer, CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Close)
{
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, null, CancellationToken.None);
}
else
{
Console.WriteLine(Encoding.ASCII.GetString(buffer, 0, result.Count));
}
}
}
就是这样。现在用.NET 来实现这个真的很容易。
不知道他最终是如何使用该代码的,但如果你看到他进行黑客攻击计算机并通过 WebSocket 连接对其进行命令,则通信很可能建立在这段代码之上。😃
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。