当前位置: 首页 > news >正文

使用 .NET 6.0 的简单 WebSocket 客户端和服务器应用程序

几个月前,有同事来找我,问能否用 .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 连接对其进行命令,则通信很可能建立在这段代码之上。😃

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

http://www.dtcms.com/a/287867.html

相关文章:

  • 基于GEE与哨兵2号的土地覆盖分类方法及实现
  • 137、真心话大冒险测谎器3.0
  • [故障诊断方向]基于二维时频图像和数据增强技术的轴承故障诊断模型
  • 家庭KTV v1.1.9 | 曲库丰富,无限制免费K歌
  • Kotlin main函数
  • RabbitMQ—事务与消息分发
  • JUC并发包CountDownLatch减法计数器的使用实例(多线程)
  • Git 完全手册:从入门到团队协作实战(2)
  • 万字解析LVS集群
  • Pandas 30分钟
  • Mybatis:注解完成增删改查
  • steam游戏搬砖项目超完整版实操分享
  • 解惑LINQ中的SelectMany用法
  • 48Days-Day03 | 删除公共字符,两个链表的第一个公共结点,mari和shiny
  • CCF编程能力等级认证GESP—C++8级—20250628
  • 【EMC设计基础--信号环路分析、PCB设计规则】
  • 深入解析文件操作(上)- 二进制文件和文本文件,流的概念,文件的打开和关闭
  • Visual Studio Code(VSCode)中设置中文界面
  • 使用C#对象将WinRiver项目文件进行复杂的XML序列化和反序列化实例详解
  • STM32_Hal库学习ADC
  • XSS的反射型、DOM型、存储型漏洞
  • sqli-labs靶场通关笔记:第32-33关 宽字节注入
  • Go语言中的类型转换与类型推断解析
  • Spring AI硬核攻略:235个模块解析 + 6大场景实战
  • view和pure的区别
  • 智能合约代理与批量调用优化:最小代理与MultiCall的应用
  • Python趣味算法:百钱百鸡问题——双重循环优化与算法效率分析
  • 【Bluedroid】btif_av_sink_execute_service之服务器启用源码流程解析
  • Typecho博客Ajax评论功能实现全攻略
  • 我是怎么设计一个防重复提交机制的(库存出库场景)