我正在使用XSockets 3.x(最新)。
我已经设置了一个控制器:
public class NotificationsController : XSocketController
{
public NotificationsController()
{
// Bind an event for once the connection has been opened.
this.OnOpen += OnConnectionOpened;
// Bind an event for once the connection has been closed.
this.OnClose += OnConnectionClosed;
}
void OnConnectionOpened(object sender, XSockets.Core.Common.Socket.Event.Arguments.OnClientConnectArgs e)
{
// Notify everyone of the new client.
this.SendToAll(new TextArgs("New client. Called right from OnConnectionOpened.", "notify"));
}
}
可以看出,它只是一个基本的控制器,它监听连接并在建立新连接后通知每个人,但是,它不起作用-消息未收到。 Chrome的开发工具也没有显示Frame。
我的网络客户端:
var xs = new XSockets.WebSocket("ws://" + window.location.hostname + ":1338/notifications");
xs.onopen = function(e)
{
console.log("Connected", e);
};
xs.on('notify', function(data)
{
console.log(data);
});
在控制台中显示以下输出:
这在网络选项卡->框架中:
我可以通过将
SendToAll
调用推迟到System.Threading.Timer
并超时来解决此问题。我的调试显示,50ms不一致,因此我将其设置为300ms,这似乎还可以,但是计时器感觉很麻烦。我该如何解决该问题?
当XSockets真正为客户端准备好了时,也许有一个我可以听的事件吗?
最佳答案
在3.0.6中这样做的原因是所有与发布和订阅有关。
这意味着消息将仅在服务器上订阅了该主题的情况下发送给客户端。在您提供的示例中,您似乎只有一个客户。自绑定以来,此客户端将不会收到自己的“通知”消息
xs.on("notify",callback);
发生OnOpen时未绑定在服务器上...因此,客户端连接将无法获取有关其自身连接的信息。
有几种解决方法...
1在绑定通知之前,不要通知连接。这是通过在绑定中添加第三个回调来完成的。当订阅绑定在服务器上时,将触发该回调。像这样
xs.on('notify', function(d){console.log('a connection was established')}, function(){console.log('the server has confirmed the notify subscription')});
您将在第一个回调内调用服务器方法来通知其他人...
2发送信息之前,请在服务器上进行绑定,这可能是一个更麻烦的选择。
void OnConnectionOpened(object sender, OnClientConnectArgs e)
{
//Add the subscription
this.Subscribe(new XSubscriptions{Event = "notify",Alias = this.Alias});
// Notify everyone of the new client.
this.SendToAll("New client. Called right from OnConnectionOpened.", "notify");
}
3使用XSockets.NET 4.0 BETA,它具有改进的通信功能并允许RPC或Pub / Sub。在4.0中,您会在OnOpen事件中这样做
//Send the message to all clients regardless of subscriptions or not...
this.InvokeToAll("New client. Called right from OnConnectionOpened.", "notify");
//Client side JavaScript
xs.controller('NotificationsController').on('notify', function(data){
console.log(data);
});
//Client side C#
xs.Controller("NotificationsController").On<string>('notify', s => Console.WriteLine(s));
4.0还有很多其他重要的改进...您可以在这里阅读到您对4.0感兴趣的内容http://xsockets.github.io/XSockets.NET-4.0/
//可能是样本中的错别字...从我的头顶开始写...