我非常担心一个问题,我尝试了 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# 中可能遇到此问题的人。我自己找到了问题的解决方案。
在阅读在线帖子以及SocketIO和EngineIO的文档时,我想我应该尝试一些至少我没有发现在任何线程中编写的东西。
我原来的消息是:
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 函数。
我希望这对某人有帮助,因为我尝试了很多解决方案,但最终成功了。
参考:这也有帮助