c# – 使用WCF的聊天室功能,双工回调与轮询?

c# – 使用WCF的聊天室功能,双工回调与轮询?,第1张

概述我正在使用WCF,我在我的C#程序中放了一个聊天室设施.所以我需要能够从服务器向客户端发送两个事件的信息 – >当用户连接/断开连接时,我更新已连接用户的列表并将其发送回所有客户端以在TextBlock中显示 >当用户发布消息时,我需要服务器将该消息发送给所有客户端 所以我正在寻找有关实施此方法的最佳方法的建议.我打算使用netTcpBinding对客户端进行双工回调,但后来遇到一些问题,如果连接 我正在使用WCF,我在我的C#程序中放了一个聊天室设施.所以我需要能够从服务器向客户端发送两个事件的信息 –

>当用户连接/断开连接时,我更新已连接用户的列表并将其发送回所有客户端以在TextBlock中显示
>当用户发布消息时,我需要服务器将该消息发送给所有客户端

所以我正在寻找有关实施此方法的最佳方法的建议.我打算使用netTcpBinding对客户端进行双工回调,但后来遇到一些问题,如果连接关闭则无法回调客户端.我需要使用percall实例来提高可扩展性.我被告知这个帖子我不应该打开连接,因为它会“显着限制scalibity” – WCF duplex callbacks,how do I send a message to all clients?

但是,我查看了编程WCF服务一书,作者似乎说这不是问题,因为’在两次调用之间,客户端持有对代理的引用,该代理在结尾处没有实际对象.线.这意味着您可以在客户端关闭代理之前很久就处理服务实例占用的昂贵资源

>那么哪个是正确的,保持代理在客户端打开是否可以?
>但即使这很好,也会导致另一个问题.如果在呼叫之间销毁服务实例,他们如何进行双工回调以更新客户端?关于percall实例,编程WCF服务的作者说’因为一旦方法返回就会丢弃该对象,你不应该脱离后台线程或将异步调用发送回实例’
>让客户轮询服务更新会更好吗?我可以想象,这比双工回调效率低得多,客户端最终可能会使用双工回调频繁地轮询服务50倍.但也许别无他法?这可以扩展吗?我设想了几百个并发用户.

解决方法 因为我告诉你服务器回调不会扩展,我应该解释一下.首先让我谈谈你的问题:

>如果不拥有相关书籍,我只能假设作者要么只是引用基于http的传输,要么只是请求 – 响应,没有回调.回调需要两件事之一 – 服务器需要维护与客户端的开放TCP连接(意味着服务器上有每个客户端使用的资源),或者服务器需要能够打开连接到监听客户端上的端口.由于您使用的是netTcpBinding,因此您的情况将是前者. wsDualhttpBinding是后者的一个例子,但是它引入了许多路由和防火墙问题,使得它在互联网上无法工作(我假设公共互联网是你的目标环境 – 如果没有,请告诉我们).
>您已经直观地弄清楚了回调需要服务器资源的原因.同样,wsDualhttpBinding有点不同,因为在这种情况下,服务器实际上是通过新连接回调客户端以发送异步回复.这基本上要求在客户端打开端口并穿过任何防火墙,这是普通互联网用户所不能想到的.这里有更多:WSDualHttpBinding for duplex callbacks
>您可以通过几种不同的方式来构建它,但如果您不希望客户端的开销(以及可能的延迟)不断地敲击服务器以进行更新,那么这是可以理解的.同样,在几百个并发用户中,您可能仍然处于一个好的服务器可以使用回调处理的范围内,但我认为您希望系统能够在需要时(或在高峰时间)扩展到超出该范围的系统.我要做的是:

>使用回调代理(我知道,我告诉过你不要)…客户端连接创建新代理,这些代理存储在一个线程安全的集合中,偶尔检查生存(如果发现已经死了则清除).
>而不是让服务器直接从一个客户端发送消息到另一个客户端,让服务器将消息发布到某些Message Queue Middleware.有大量的这些 – MSMQ受欢迎的windows,ActiveMQ和RabbitMQ是FOSS(免费开源软件),Tibco EMS在大企业中很受欢迎(但可能非常昂贵).你可能想要使用的是一个主题,而不是一个队列(更多关于队列与主题here).
>在服务器上有一个专门用于读取主题消息的线程(或多个线程),如果该消息发送到该服务器上的实时会话,则将该消息传递给服务器上的代理.

这是架构的草图:

此体系结构应允许您通过简单地添加更多服务器来自动扩展,并在它们之间负载平衡新连接.消息排队基础设施将是唯一的限制因素,我提到的所有内容都将超出您所见过的任何可能的用例.因为您将使用主题而不是队列,所以每条消息都将被广播到每个服务器 – 您可能需要找出一种更好的方式来分发消息,例如使用基于散列的分区.

总结

以上是内存溢出为你收集整理的c# – 使用WCF的聊天室功能,双工回调与轮询?全部内容,希望文章能够帮你解决c# – 使用WCF的聊天室功能,双工回调与轮询?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1228559.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存