我正在尝试使用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中的等效函数,但我在任何地方都找不到。我在这里只找到了两个签名:
public virtual void On(string eventName, Action<IMessage> action);
public virtual void On(string eventName, string endPoint, Action<IMessage> action);
所以我想知道,SocketIO4Net中有这个功能吗?还是我必须发出另一个事件才能与服务器确认?
所以我自己找到了一个解决方案。我使用的源代码来自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);
我不得不承认,这根本不是一种优雅的工作方式。但这可能是现在唯一的方法,因为原作者似乎不再维护这个项目了。希望将来有人能完成未完成的部分。
如果您查看示例项目(在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} rn", jsonMsg.Args));
});