我正在使用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的开发工具也没有显示任何框架。
我的网络客户端:
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,它似乎工作正常,但计时器感觉非常hacky。
如何解决问题?
当XSockets真的为客户做好准备时,是否有可以收听的事件?
答案 0 :(得分:1)
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')});
您可以在第一个回调中调用servermethod来通知其他人......
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 使用改进了通信并允许RPC或Pub / Sub的XSockets.NET 4.0 BETA。在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/
//样本中的拼写错误......从头顶写下来......