使用C# 利用 ASP.NET Core WebSocket 服务器,并通过 WebSocket 通信。

使用C# 利用 ASP.NET Core WebSocket 服务器,并通过 WebSocket 通信。

编码文章call10242025-02-01 3:11:3616A+A-

今天有个盆友让我帮忙采集一个网站数据,我发现登录口竟然无法抓包,MD真是见了鬼了,在费时半小时后,在客户端JS中找到个关键词 WebSocket,这是什么鬼,百度查了查,大概知道了那么点用法。赶紧做一下笔记,避免自己忘记了,这玩意做防爬也不错啊。在登陆口一些位置,如果是网站,在展现数据GetList一类的方法不建议用这个技术,不利于SEO。但用来做反扒却真心不错。至少网络上一些脚本小子可以挡一挡。

下面做一个WebSocket技术的实战,各位看官看好了!其实非常简单。

【服务器端】创建 ASP.NET Core 项目

dotnet new web -n WebSocketExample
cd WebSocketExample

【服务器端】添加 WebSocket 支持

在 Startup.cs 中配置 WebSocket 服务:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 添加必要的服务
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
	      //这句话 重点!!!!!!
        app.UseWebSockets(); // 启用 WebSocket 支持

        app.Use(async (context, next) =>
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                var webSocket = await context.WebSockets.AcceptWebSocketAsync();
                await HandleWebSocketConnection(webSocket);
            }
            else
            {
                await next();
            }
        });

        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapGet("/", async context =>
            {
                await context.Response.WriteAsync("WebSocket server is running.");
            });
        });
    }
    //解析传上来的数据
    private async Task HandleWebSocketConnection(WebSocket webSocket)
    {
        var buffer = new byte[1024 * 4];
        WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);

        while (!result.CloseStatus.HasValue)
        {
            // 处理接收到的消息
            var message = Encoding.UTF8.GetString(buffer, 0, result.Count);
            Console.WriteLine($"Received: {message}");

            // 发送回消息
            var responseMessage = $"Echo: {message}";
            var responseBuffer = Encoding.UTF8.GetBytes(responseMessage);
            await webSocket.SendAsync(new ArraySegment(responseBuffer), result.MessageType, result.EndOfMessage, CancellationToken.None);

            result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None);
        }

        await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
    }
}

【客户端】创建一个简单的前端页面

在 wwwroot 文件夹中创建一个 HTML 文件,例如 index.html:




    
    
    WebSocket Example


    

WebSocket Example

运行项目

在项目目录中运行以下命令启动应用:

dotnet run

访问 WebSocket

这个时候,你打开自己电脑上随便一款浏览器,访问
http://localhost:5000/index.html,你可以在输入框中输入消息并发送,服务器会回显你发送的消息, WebSocket 进行实时通信还是挺简单的,由于大多数爬虫不支持 WebSocket,因此使用这种方式可以降低被抓取的风险。你可以根据需要扩展此示例,添加更多功能和安全措施。如果还有更牛叉的方法,一定留言说说哈。

又花了半小时看了点其他资料,感觉这技术除了用于实时数据传输外,还有许多其他应用场景,第一个想到的是网页实时聊天工具,我感觉WebSocket 这东西非常适合构建实时聊天应用,因为它允许在客户端和服务器之间保持持久连接,实时发送和接收消息。第二个是客户端主动连接上后,好像服务器端可以主动一直发消息给客户端啊,这不就内网穿透了?我记得好像.NET 又出了一个基于webassembly技术的blazor,好像是这东西,那是不是都可以做木马了?不知道权限够不够,第三个想到股票和金融数据,我有炒股,感觉WebSocket 天生就可以用于实时传输股票价格、金融市场数据等信息,确保用户能够及时获取最新的市场动态。还有一个就是远程时评直播流传输,感觉用这技术快很多吧?暂时就想到这么多,应该快要凑足2000字了吧。哈哈哈哈哈。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4