2

我想将数据推送到客户端应用程序。客户端应用程序可以很厚也可以很薄。推动必须通过互联网进行。如何才能做到这一点?

编辑: 有没有一种方法可以让客户端应用程序打开与服务器的连接,让它在其生命周期内保持活动状态,然后继续通过该连接接收数据。我可以建造这样的东西吗?任何帮助表示赞赏。

更新:我的胖客户端将在 Wpf 中,而我的瘦客户端将是一个 silverlight 应用程序。我希望有最小的延迟。此外,对于某些类别的数据,更新频率将超过每秒 10 次。如果现成的东西不存在,我可以构建这样的解决方案。我只是想要一些指示/想法开始。

4

7 回答 7

2

你首先需要问自己几个问题:

  • 我的“客户端”是网络浏览器还是可执行文件?
  • 有多少客户端将连接到我的服务器?
  • 多久向客户端发送一次数据?
  • 客户端立即接收数据(而不是一两秒延迟)有多重要?

如果您的客户端是 Web 浏览器,那么您的选择会更加有限,请查看Comet以获得一些指导。正如其他人提到的,这里有一篇很好的博客文章,解释了如何使用 ASP.NET 来做 Comet

如果您不希望有很多客户端,那么打开从客户端到服务器的连接可能是一个可行的解决方案,请查看这些 MSDN 页面以获取信息和一个基本示例: - TcpListener - TcpClient

如果您期望有很多客户端(超过 50 个,具体取决于您的服务器硬件),那么您的选择取决于其他问题的答案:

如果您的客户端频繁获取数据并且可以接受短(秒)延迟,那么轮询是一个简单的解决方案,您可以对客户端隐藏实现,以便看起来数据正在被推送,但实际上客户端中有一个线程每隔几秒轮询一次。

如果您的客户不经常获取数据,那么像Comet这样的东西可能是一个不错的选择,如果您正在寻找 .NET 解决方案,请搜索“Long Polling WCF”。

更新: 既然你现在说你的客户是 Silverlight,我强烈推荐这些博客文章,谈论你所追求的东西:

WCF 双工服务更好,因为它使用设置消息和响应,因此无需自己解析文本或二进制数据。它基本上是 Silverlight 的 Comet 版本。

于 2009-11-29T13:32:04.003 回答
2

如果您的客户端打开一个到服务器的套接字,它可以无限期地保持打开状态。只要确保每隔一段时间发送一些keepalive数据包即可。否则,“智能”路由器可能会终止您的连接。

所以是的,它可以做到!

于 2009-11-29T13:07:57.060 回答
0

简短的回答是使用轮询。

这个问题非常相似:

asp.net http服务器推送到客户端

于 2009-11-29T12:19:15.833 回答
0

我建议你使用Comet。查看以下文章示例

于 2009-11-29T12:34:14.683 回答
0

今年早些时候我需要这样做,但我在这台计算机上找不到代码。这个SO 链接有帮助吗?

更新:我找到了我需要时使用的文章。警告它使用 3.5,我认为是 WCF。从 Keyvan Nayyeri 的文章中复制的代码如下:

        OperationContext context = OperationContext.Current;
        MessageProperties messageProperties = context.IncomingMessageProperties;
        RemoteEndpointMessageProperty endpointProperty =
            messageProperties[RemoteEndpointMessageProperty.Name]
            as RemoteEndpointMessageProperty;

        return string.Format("Hello {0}! Your IP address is {1} and your port is {2}",
            value, endpointProperty.Address, endpointProperty.Port);
于 2009-11-29T12:34:30.780 回答
0

您最好的解决方案是使用 Kragen 建议的轮询,它可以确保您的服务器不会因空闲会话而陷入困境,这些空闲会话仅在极少数情况下发送数据。轮询为您提供了相同的功能,但是您的服务器上没有持续的负载,除了每个客户端需要一个线程(假设您的服务器为每个客户端生成一个线程,如 apache 等)。使用瘦客户端(在浏览器中运行),您可以使用 AJAX 来防止页面不断重新加载。如果在胖客户端中,您可以做同样的事情,但使用后台定时事件来发送请求。

如果您仍然需要在胖客户端场景中从服务器向客户端推送数据,最好的解决方案是让客户端打开一个监听套接字,当需要将来自服务器的请求推送到客户端时,服务器连接到客户端并发送请求(经过身份验证,服务器记录用户 IP 以启动连接)。在瘦客户端场景(通过 Web 浏览器)中,如果不是不可能的话(当使用适当的安全策略时),这将是极其困难的。

我们会建议您更详细地解释您为什么要这样做,这将使我们能够为您提供更“有针对性”的解决方案,以满足您的需求。

于 2009-11-29T13:11:59.407 回答
-1

有很多方法 - 最好的方法 - 让客户端检查服务器的更新,并让它拉数据(使用标准 ftp 协议 - 用于文件或其他任何其他通信协议 - 如 WCF、Web 服务等。 ) 这样您就不必担心防火墙和 nat。

查看您的评论 - 这会很困难,好像客户端在 nat 后面,没有静态路由是不可能的 - 所以如果这可能是你的情况,你不能推送......你必须从客户端打开连接.

于 2009-11-29T12:18:58.253 回答