0

我有以下使用XSockets库的 C# 代码:

var client = new XSocketClient("ws://awebsocket.org:4502/Controller", "*");
client.Bind("commands", e => { ... });

现在我正在尝试使用WebSocket包将此代码移植到 Python 2.7:

ws = WebSocketApp("ws://awebsocket.org:4502/Controller")

我的问题是,WebSocket 包没有提供这样的“.Bind()”方法。我所拥有的一切都是 onmessage-, onerror-callbacks。现在我正在考虑自己实现这个绑定,但我真的不知道 XSockets 是如何在内部实现这个的。有没有关于它的规范?XSockets-Server 是否通过另一个 URL 发送此消息,例如ws://awebsocket.org:4502/Controller/messagesws://awebsocket.org:4502/Controller?messages

4

1 回答 1

1

在 XSockets 3.* 中,框架支持 pub/sub,这意味着客户端订阅主题,然后在主题发布时获取消息。

因此,您关于将所有消息发送给所有客户端的假设是错误的。将所有消息发送给所有客户端并让客户端 API 过滤掉不需要的消息将是一个非常糟糕的解决方案。因此,服务器实际上会跟踪订阅的客户端。

当然,它比 XSockets 中的要多得多,因为您也可以选择仅发送给订阅者的一个子集,例如

this.SendTo(p => p.Age > 18 && p.Age < 25 && p.Location == "UK", "Hello young people in UK", "topicOfChoice");

如果您想构建自己的客户端,XSockets 团队一定会帮助您。实际上,您只需要获取有关要发送到“订阅”、“取消订阅”等内容的信息。所有消息都遵循 XSockets 用来知道在哪里分派它们以及做什么的协议。

我强烈建议为 4.0 编写客户端,因为 4.0 与 3 相比有很大的变化。*

在 4.0 中,消息可能如下所示

{"D":"{\"text\":\"Hello World\"}","C":"Chat","T":"chatmessage"}

该消息基本上意味着:

数据

"D":"{\"text\":\"Hello World\"}"

控制器

"C":"Chat"

方法/主题

"T":"chatmessage"

所以消息真的说,发送 {text:'Hello World'} 到控制器 Chat 和方法 ChatMessage (可能是一些错误,从我的脑海中写出来)

控制器聊天可能看起来像这样

public class Chat : XSocketController
{
    public void ChatMessage(string text)
    {
        this.InvokeToAll(text,"chatmessage");
    }
} 

上面的示例使用 RPC,这意味着连接到此控制器的所有客户端都会收到消息。如果您需要发布/订阅,您只需替换

this.PublishToAll(text,"chatmessage");

现在只有订阅了“chatmessage”主题的客户才能获得数据

然后你当然可以用

PublishTo<T>(Func<T,bool> exp, object o, string topic)

或者

InvokeTo<T>(Func<T,bool> exp, object o, string topic)

Soo...如果您想编写一个客户端,我建议您联系 XSockets 以获取有关发送什么以进行发布/订阅等的所有信息...

于 2014-06-11T06:34:04.293 回答