net7创建websocket方式

以下代码创建了一个websocket服务端,如果要发消息到网页,应该怎样写发送呢?


var host = WebSocketHostBuilder.Create()
                        .ConfigureAppConfiguration((hostContext, config) =>
                        {
                            config.AddInMemoryCollection(new Dictionary<string, string>
                            {
                                { "serverOptions:listeners:0:ip", "Any" },
                                { "serverOptions:listeners:0:port", "9090" }
                            });
                        })
                        .UseWebSocketMessageHandler(async (session, msg) =>
                        {
                            // 接收消息
                            Console.WriteLine(msg.Message);

                            try
                            {
                                // 服务器中转
                                string[] msgs = msg.Message.Split("|");
                              
                              
                            }
                            catch { }
                        })
                        .UseSessionHandler(async session =>
                        {
                            // 知道是谁连进来
                            Sessions.Add((WebSocketSession)session);
                        })
                        .Build();
            await host.RunAsync();           

在WebSocket服务端代码中,要向网页发送消息,可以使用WebSocket连接对象(即WebSocketSession)的SendMessageAsync方法来发送消息。在WebSocket服务端代码的适当位置,调用SendMessageAsync方法即可将消息发送到网页上。

在上面的代码中,我们可以在UseWebSocketMessageHandler的委托中添加发送消息的逻辑。首先,将消息接收的部分保留不变:

.UseWebSocketMessageHandler(async (session, msg) =>
{
    // 接收消息
    Console.WriteLine(msg.Message);

    try
    {
        // 服务器中转
        string[] msgs = msg.Message.Split("|");
        // ...处理消息中转逻辑
    }
    catch { }
})

接下来,在接收消息的代码块中添加发送消息的逻辑。假设我们想要将接收到的消息原封不动地发送回给网页,可以按照以下方式完成:

.UseWebSocketMessageHandler(async (session, msg) =>
{
    // 接收消息
    Console.WriteLine(msg.Message);

    try
    {
        // 服务器中转
        string[] msgs = msg.Message.Split("|");
        // ...处理消息中转逻辑

        // 发送消息回网页
        await session.SendMessageAsync(msg.Message);
    }
    catch { }
})

以上代码在处理完消息中转逻辑后,通过await session.SendMessageAsync(msg.Message)将原始消息回传给网页。

需要注意的是,网页端需要有WebSocket的连接来接收这些消息。在网页端,可以通过JavaScript创建WebSocket连接,并在连接打开时注册消息接收的处理函数,来实现消息的接收和处理。

示例网页端代码如下:

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Example</title>
</head>
<body>
    <div id="messages"></div>

    <script>
        const ws = new WebSocket("ws://localhost:9090");

        ws.onopen = function(event) {
            console.log("WebSocket connection established.");
        };

        ws.onmessage = function(event) {
            const messagesDiv = document.getElementById("messages");
            messagesDiv.innerHTML += "<p>" + event.data + "</p>";
        };

        ws.onclose = function(event) {
            console.log("WebSocket connection closed.");
        };
    </script>
</body>
</html>

在上述网页代码中,我们使用JavaScript创建了WebSocket连接,并在连接打开时注册了消息接收的处理函数,当收到服务器发送的消息时,将消息显示在<div id="messages"></div>元素中。

这样,当WebSocket服务端收到消息后,会将消息原封不动地发送回给网页,网页端就可以接收并显示收到的消息了。

【以下回答由 ChatGPT 生成】

var host = WebSocketHostBuilder.Create()
    .ConfigureAppConfiguration((hostContext, config) =>
    {
        config.AddInMemoryCollection(new Dictionary<string, string>
        {
            { "serverOptions:listeners:0:ip", "Any" },
            { "serverOptions:listeners:0:port", "9090" }
        });
    })
    .UseWebSocketMessageHandler(async (session, msg) =>
    {
        // 接收消息
        Console.WriteLine(msg.Message);

        try
        {
            // 服务器中转
            string[] msgs = msg.Message.Split("|");

            // 发送消息到网页
            var webSocketSession = (WebSocketSession)session;
            await webSocketSession.SendAsync("Hello, world!");
        }
        catch { }
    })
    .UseSessionHandler(async session =>
    {
        // 知道是谁连进来
        var webSocketSession = (WebSocketSession)session;
        Sessions.Add(webSocketSession);
    })
    .Build();

await host.RunAsync();

以上代码修改了原始代码,以便在WebSocket服务端接收消息后发送消息到网页。具体修改包括以下几点:

  1. msg.Message的内容按照"|”进行 split 获得消息数组 msgs

  2. 获取到当前 session 对象后,使用 ((WebSocketSession)session) 进行类型转换,并将其存储到 webSocketSession 变量中。

  3. 使用 await webSocketSession.SendAsync("Hello, world!") 将消息 Hello, world! 发送到网页。

请注意,以上示例代码仅供参考,具体实现还需要根据具体情况进行修改。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^