如何在Python中实现去中心化网络?
我想写一个Python脚本,用来检查用户本地网络上是否有其他正在运行的脚本实例。
为了方便讨论,假设我正在写一个只能通过命令行运行的应用程序,当在本地网络上“发现”另一个应用程序实例时,它会更新屏幕。下面是一个示例输出:
$ python question.py
Thanks for running ThisApp! You are 192.168.1.101.
Found 192.168.1.102 running this application.
Found 192.168.1.104 running this application.
有没有什么库或项目可以帮助实现这样的功能?
4 个回答
2
- 你可以选择一种基于服务器的解决方案:在一个中央服务器上,客户端可以注册自己,并查询其他已经注册的客户端。像Twisted这样的服务器框架可以帮助你实现这个功能。
- 在点对点的环境中,可以使用推送技术,比如UDP广播,每个客户端会定期在网络上发送一个心跳包,让其他客户端接收到。基本的模块,比如socket,可以帮助你完成这项工作。
- 另外,你也可以选择拉取的方法,让有兴趣的客户端主动去发现其他客户端。这种方法可能是最复杂的。首先,你需要扫描网络,也就是找出哪些IP地址属于本地网络,然后逐个检查这些IP。接着,你需要依次联系每个IP。如果你的程序打开了一个TCP端口,你可以尝试连接这个端口,看看你的程序是否在那运行。如果你希望你的程序完全不知情于这些查询,你可能需要打开一个ssh连接到远程IP,并扫描进程列表来查找你的程序。所有这些可能涉及到各种模块和库。你可以看看execnet。
3
好吧,你可以使用socket模块来写一些东西。不过,你需要两个程序,一个是在用户本地电脑上的服务器,另一个是与服务器交互的客户端程序。服务器还会使用select模块来监听多个连接。然后,你会有一个客户端程序,当它运行时,或者你想要的时候,它会发送一些东西给服务器。服务器可以打印出它正在维护的连接,包括一些细节,比如IP地址。
这个内容在这个链接上有非常详细的说明,比你需要的还要多,但它会像我一样给你解释清楚。http://ilab.cs.byu.edu/python/
8
有一种方法是,你要处理的应用程序正在发送UDP数据包,而你的应用程序则从不同的节点接收这些数据包并进行显示。Twisted网络框架提供了实现这个功能的工具。它的文档中也有一些简单的例子。