从OnOpen事件发送时未收到消息

时间:2014-08-04 08:11:12

标签: c# javascript websocket xsockets.net

我正在使用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);
});

我在控制台中看到以下输出:
Console output

这是在网络标签中 - >的
Network tab, Frames

我可以通过将SendToAll调用延迟System.Threading.Timer来解决问题。我的调试显示,50ms是不一致的,所以我把它设置为300ms,它似乎工作正常,但计时器感觉非常hacky。

如何解决问题?
当XSockets真的为客户做好准备时,是否有可以收听的事件?

1 个答案:

答案 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/

//样本中的拼写错误......从头顶写下来......