幾個月前,有同事來找我,問能否用 .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 連接對其進行命令,則通信很可能建立在這段代碼之上。😃
如果您喜歡此文章,請收藏、點贊、評論,謝謝,祝您快樂每一天。