【问题标题】:SocketIO4Net Acknowledgement CallbackSocketIO4Net 确认回调
【发布时间】:2014-06-27 10:44:11
【问题描述】:

我正在尝试使用 SocketIO4Net 与我的 NodeJS 服务器进行通信。正如 NodeJS SocketIO 文档所述,我们可以这样做:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  socket.on('ferret', function (name, fn) {
    fn('woot');
  });
});

fn 指的是回调函数。我需要 SocketIO4Net 中的等效功能,但我在任何地方都找不到。我在这里找到的只有 2 个签名:

public virtual void On(string eventName, Action<IMessage> action);
public virtual void On(string eventName, string endPoint, Action<IMessage> action);

所以我想知道,这个功能在 SocketIO4Net 中可用吗?还是我必须发出另一个事件来与服务器确认?

【问题讨论】:

    标签: c# socketio4net


    【解决方案1】:

    所以我自己找到了解决方案。我正在使用来自http://socketio4net.codeplex.com/ 的源代码,其中提到一个开发分支位于:https://github.com/jstott/socketio4net/tree/develop 虽然它不适合我编译。于是我从codeplex包入手,尝试自己实现这个功能。

    原来codeplex的SocketIo4Net包是不完整的。我必须先修复一些错误。修补后的代码现在在我的存储库中:https://git01.codeplex.com/forks/zhangyaoxing/socketio4net

    通过使用此包,您可以通过以下方式手动将 AckMessage 发送回服务器:

    // Simulate a ack callback because SocketIO4Net doesn't provide one by default.
    var msgText = JsonConvert.SerializeObject(new object[] {
        // object you want to send back
    });
    var ack = new AckMessage()
    {
        AckId = msg.AckId,
        MessageText = msgText
    };
    this.socket.Send(ack);
    

    我不得不承认,这根本不是一种优雅的工作方式。但这可能是现在唯一的方法,因为原始作者似乎不再维护该项目。希望以后有人能完成未完成的部分。

    【讨论】:

      【解决方案2】:

      如果您查看sample project(在 codeplex 上),您会发现示例 CallbackExample。客户端可以发出一条消息,当服务器处理并执行回调时,该回调将依次在客户端上执行。

      Console.WriteLine("Emit [socket].[messageAck] - should recv callback [root].[messageAck]");
      socket.Emit("messageAck", new { hello = "mama" }, null, (callback) =>
          {
              var jsonMsg = callback as JsonEncodedEventMessage; // callback will be of type JsonEncodedEventMessage, cast for intellisense
              Console.WriteLine(string.Format("callback [root].[messageAck]: {0} \r\n", jsonMsg.Args));
          });
      

      【讨论】:

      • 我明白了。当我阅读代码时,我认为AckMessage 是我应该用于回调的对象。但它似乎不完整,因为它没有正确解析服务器消息,我的意思是因为正则表达式问题它没有得到 AckId。
      • 我不确定你指的是什么RE,但如果你想从服务器返回一个确认消息,你需要使用emite vs send。它与 socket.io 客户端代码几乎相同: socket.emit('ferret', 'tobi', function (data) { console.log(data); // data will be 'woot' });
      • 抱歉回复晚了(我知道太晚了)。嗯,是的,Emit 有一个回调。我想要的是Oncallback。就像我在节点示例中描述的那样,On 也有一个回调。
      猜你喜欢
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 2014-06-28
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多