【问题标题】:python - how can server initiate a connection to clientpython - 服务器如何启动与客户端的连接
【发布时间】:2015-01-11 05:08:09
【问题描述】:

所以我创建了一个应用程序,该应用程序连接到服务器并告诉它做某事。但是服务器需要很多时间来做这件事(比如一个小时左右)。因此,长时间将客户端连接到服务器是没有意义的。我希望服务器必须创建与客户端的连接,以通知他已准备好交付最终结果。然后连接后,他将数据发送给客户端。

我在这里思考两个想法:

  1. 我也可以在客户端创建一个服务器,客户端可以监听服务器连接。但是,我的客户通常是一些资源有限的桌面应用程序或移动应用程序,其中一些也位于防火墙/NAT 后面。因此,即使他们有一台服务器正在运行,我也不确定我的主服务器是否能够连接到他们。

  2. 客户端可以定期检查结果是否准备好。这样客户端就不必维护任何服务器或任何东西。它将是普通的旧客户端服务器架构。但这花费了我很多不必要的流量,因为结果可能会在几分钟到几小时内提供。客户端不断锁定服务器对我来说似乎不太好。

我首先不知道从哪里开始或在谷歌上搜索这些东西。 我知道这样的事情存在,因为我经常看到诸如“Skype”之类的服务器通知我的桌面应用程序我有一个新朋友请求,或者当有新邮件时谷歌在我的桌面上显示一条消息的 Gmail 通知系统收到了。

大多数谷歌搜索都在客户端连接到服务器的地方产生相同的东西。但是这里的情况正好相反。

如果这个问题不达标,也可以多参考几条,我会删除这个帖子。很有可能我只是没有思考某些事情并且很愚蠢。请帮忙。谢谢。

【问题讨论】:

    标签: python python-3.x client-server


    【解决方案1】:

    大多数情况下如你所说:

    1. 客户端可以定期检查结果是否准备好。这样客户就不必维护任何 服务器什么的。它将是普通的旧客户端服务器 建筑学。

    因为它容易实施。

    您可以尝试的另一件事是UDP-hole-punshing。我猜它的代码不多,但也需要一个保持活动的信号。然后服务器可以发送给客户端。

    第三个想法来自pwnat。它通过IP工作。客户端将预定义的数据包发送到无法到达的地址。如果确切的数据包已知,这允许互联网上的任何人回答。发送和接收数据包以及回复需要 IP 级别的访问权限,这通常需要更高的权限。

    您也可以使用 UPNP 配置客户端防火墙以允许某些数据包通过。

    【讨论】:

    • pwnat 和 UPNP 不是我想到的,虽然很高兴知道。 UDP-hole-pushing 看起来很有希望,但话又说回来,我发现一篇类似的文章描述了这个保持连接活动的过程(见我的回答),并且它已经实现了。不管怎么说,多谢拉。很高兴知道更多的东西。
    【解决方案2】:

    所以在我研究了很多相关文章之后,这是我想出的。

    这些链接描述了所谓的“服务器推送”,它基本上将数据从服务器推送到客户端。这里讨论了多种方法。我的第 2 点实际上非常接近解决方案,第 2 点的术语称为长轮询。

    1. http://en.wikipedia.org/wiki/Push_technology
    2. http://mrjoes.github.io/2013/06/21/python-realtime.html
    3. http://flask.pocoo.org/snippets/80/

    但是这两篇文章中讨论的方法都是关于将数据推回网络浏览器。在某些情况下,该解决方案可以扩展到移动客户端中的服务器推送,但我仍在阅读它们,因此无法发表太多评论。

    但是,对于服务器到应用程序的推送,这正是我的要求,有两件事真正站起来了:

    1. Redis Pub/Sub:redis 中 pub/sub 通道的功能非常棒。您所要做的就是将客户端订阅到服务器中的频道,并且每当服务器发布某些内容时,客户端都会自动收听。 Redis 被广泛使用,维护良好,易于使用,并且专为非常大规模的应用程序而设计。我喜欢那个。
    2. 亚马逊 SNS。现在像我这样的人(我忘了在问题中提到,我使用亚马逊作为我的服务器)使用亚马逊 aws,这个功能 SNS(简单通知系统)是为服务器到应用程序推送而设计的。它便宜、易于实现,并附带 python 库供使用。因此,如果您不想进入redis,只需使用亚马逊的这个简单工具将数据推送给您的客户。如果您需要,它还支持将数据直接推送到 SQS(简单队列服务)。

    我目前已决定使用 Amazon SNS,并将继续并肩学习 Redis,以备将来使用。

    更新:

    需要服务器推送?忘记其他一切,使用 Redis + Socket-IO + Node-JS。我怎么不知道 Websockets。它是下一个最好的东西。

    在我的应用程序中,我只是将任何想要推送给客户端的消息发送到 Redis。 Redis 发布这些消息。 Socket.IO 正在使用psubscribe 监听通道以监听模式而不是一个通道。用户类别由频道名称定义。

    一旦 socket.io(用 node.js 编写)听到消息,它会简单地将这些消息emit 发送给客户端。客户端反过来在特定端口上监听 socket.io。 Socket.io 支持rooms,就像redis 中的channel

    对于实时示例,只需 google real time chat with socket.io and node.js

    如果有人要求,我也会写一些例子。真的很简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-24
      • 2018-06-18
      • 1970-01-01
      • 2018-01-14
      • 2016-07-14
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多