Socket.IO 回调在(Node/C#)中不起作用

问题描述 投票:0回答:1

我非常担心一个问题,我尝试了 100 个解决方案,但没有任何效果。

在Python中我可以:

self.sio.emit('join', 'join', callback=self.join_acknowledgment)

并且它可以与魅力一起使用。 IE。每当它触发连接事件时,服务器都会向该函数发送一些数据作为回报。同样,我可以在 dart 中做同样的事情,没有任何问题,即

 _socket!.emitWithAck(
      "join",
      "join",
      ack: (data) {/*to do with data*/},);

但是在 C# sockets.io / WebSockets /SocketsSharp 中,你能想到的,我无法以任何特别可能的方式实现这一点!你能帮忙吗?

 private void OnOpen(object sender, EventArgs e)
    {
        Console.WriteLine("WebSocket opened");
        string uniqueId = Guid.NewGuid().ToString();
        var joinData = new JObject
        {
            { "join", "join" },
            { "id", uniqueId },
        };

        string joinMessage = $"42[\"join\", {joinData.ToString(Formatting.None)}]";
        Console.WriteLine($"Sending: {joinMessage}");
        // Store the callback for later use
        callbacks[uniqueId] = (response) =>
        {
            Console.WriteLine("Join acknowledged with data:");
            Console.WriteLine(response);
        };
        webSocket.Send(joinMessage);
    }

我尝试了所有内容,包括上面的共享代码,我在 SocketIO/WebSocket/SocketSharp 中尝试过。我无法更改 node.js 的代码,因为它对于 python 和 flutter(dart) 100% 正常工作

Node.js 服务器端代码:

    private onConnect(): void {
    global.io.on('connection',async (socket: any) => {
        let id: string = socket.request['id']
        console.log("connected" + id);
        socket.on('join', async (args, callback) => {
            console.log('Join event received:', args);
            console.log(callback);
            //get some data from db <<<
            var mydata = getSomeDataFromDB();
            callback(resOK(mydata))
        })
    })
}
c# node.js websocket socket.io
1个回答
0
投票

对于那些在 C# 中可能遇到此问题的人。我自己找到了问题的解决方案。

在阅读在线帖子以及SocketIOEngineIO的文档时,我想我应该尝试一些至少我没有发现在任何线程中编写的东西。

我原来的消息是:

string joinMessage = $"42[\"join\",{joinData.ToString(Formatting.None)}]";

我预计它会触发:

 socket.on('join', async (args, callback) => {

Join 总是被解雇,我也得到了参数,但回调总是空/未定义。为了解决这个问题,我将 joinMessage 更改为:

string joinMessage = $"423[\"join\", {joinData.ToString(Formatting.None)}]";

第一个数字 4 指定将整个事件视为消息。第二个数字 2 指定它是一个事件,即“加入”。我为命中和试用添加的第三个有效,指定还发送 ACK,使其成为 emitWithAck 函数。

我希望这对某人有帮助,因为我尝试了很多解决方案,但最终成功了。

参考:这也有帮助

© www.soinside.com 2019 - 2024. All rights reserved.