python - 服务器如何启动与客户端的连接

时间:2014-11-13 22:04:44

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

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

我在想这里有两个想法:

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

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

  3. 我首先不知道从哪里开始或谷歌这个东西。 我知道这样的事情存在,因为我总是看到服务器如" Skype"通知我的桌面应用我有新朋友请求或gmail通知系统,当收到新邮件时,Google会在桌面上显示一条消息。

    大多数Google搜索都会产生与客户端连接到服务器相同的内容。但情况恰恰相反。

    如果这个问题不符合标准,一些参考文献也会很棒,我会删除这篇文章。我很有可能只是没有想到什么和愚蠢的事情。请帮忙。感谢。

2 个答案:

答案 0 :(得分: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/
  4. 但是,这两篇文章中讨论的方法都是将数据推回到Web浏览器。在某些情况下,解决方案可以扩展到移动客户端中的服务器推送,但我仍在阅读它们,因此无法评论太多。

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

    1. Redis Pub / Sub:redis中的pub / sub通道的功能很棒。您所要做的就是将客户端订阅到服务器中的通道,并且只要服务器发布了某些内容,客户端就会自动收听。 Redis使用广泛,维护良好,易于使用,专为大规模应用而设计。我很喜欢。
    2. 亚马逊SNS。现在人们喜欢我(我忘了在问题中提到,我使用亚马逊作为我的服务器)使用amazon aws,这个功能SNS(简单通知系统)是为服务器到app推送而设计的。它便宜,易于实现,并附带python库使用。因此,如果您不想使用redis,只需使用亚马逊的这个简单工具将数据推送给您的客户。如果您需要,它还支持将数据直接推送到SQS(简单队列服务)。
    3. 我目前决定使用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

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

答案 1 :(得分:1)

在大多数情况下,就像你说的那样:

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

因为易于实施。

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

第三个想法来自pwnat。它适用于IP。客户端将预定义的数据包发送到不会到达的地址。这允许互联网上的任何人在已知精确数据包时回答。发送和接收数据包以及回复都需要IP级访问,这通常需要更高的权限。

此外,您可以使用UPNP配置客户端防火墙以通过某些数据包。