如何通过互联网推送数据?

时间:2009-11-29 12:14:32

标签: c# .net wpf silverlight push

我想将数据推送到客户端应用程序。客户端应用程序可以是厚或薄。推动必须通过互联网进行。怎么办呢?

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

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

7 个答案:

答案 0 :(得分:2)

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

是的,可以做到!

答案 1 :(得分:2)

首先,您需要问自己一些问题:

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

如果您的客户是网络浏览器,那么您的选项会受到更多限制,请查看Comet以获得一些指导。正如其他人提到的,这是一个good blog post explaining how to do Comet with ASP.NET

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

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

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

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

<强>更新 既然您现在声明您的客户是Silverlight,我会强烈推荐这些博客文章,谈谈您所追求的内容:

  • 使用套接字(hereherehere)从服务器发送数据
  • 使用WCF双工服务(herehere
  • 发送数据

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

答案 2 :(得分:0)

简短的回答是使用民意调查。

这个问题非常相似:

asp.net http server push to client

答案 3 :(得分:0)

我建议你使用Comet。请查看以下articleexample

答案 4 :(得分:0)

今年早些时候我需要这样做,但我在这台电脑上找不到代码。这SO link有帮助吗?

更新:我找到了我需要的时候使用的the article。警告它使用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);

答案 5 :(得分:0)

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

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

我们建议您更详细地解释为什么要尝试这样做,这样我们就可以为您提供更符合您需求的“目标”解决方案。

答案 6 :(得分:-1)

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

查看你的评论 - 这将很难,好像客户端在nat之后,没有静态路由是不可能的 - 所以如果这可能是你的情况,你就不能推......你必须打开连接客户方。