在 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 以获取有关发送什么以进行发布/订阅等的所有信息...