upnp的ssdp服务器和客户端

ssdp-upnp的Python项目详细描述


SSDP_upnp

简介

acticle Exploring UPnP with Python 提供了对upnp的非常好的理解。ssdp是它的实现之一。

该包包括 3个单独的类 、ssdp服务器、ssdp客户端、nat upnp类。前两个类继承自类threading.thread类,因此两个类实例运行在自己的单个线程上。它们不会阻塞主线。在ssdp客户机找到具有相同产品名的对等机之后,它可以通过 queue与主线程通信。NAT UPNP类在主线程上运行,因此它不会阻塞I/O,它只搜索LAN GDI(具有UPNP NAP转发功能的路由器),并将内部端口与外部端口绑定。

服务器的逻辑是用1900端口监听广播地址。如果收到“m-search”消息,它将响应其服务信息。客户端只需发送一条带有“m-search”的广播消息,即可获取服务器的服务信息。

该软件包可用于局域网环境中对等点相互查找的区块链解决方案中。

API

服务器类

run() :在主线程中运行带有I/O阻塞的服务器
start() :在I/O非阻塞的其他线程中运行服务器
stop() :停止服务器

客户

run() :在主线程中运行带有I/O阻塞的客户机
start() :在I/O非阻塞的其他线程中运行客户机
stop() :停止客户端

NAT

addportforward(内部端口,外部端口) :在主线程中运行函数。如果绑定失败,则返回无;如果绑定成功,则返回元组(外部IP、外部端口)。
removeportforward(外部端口) :在主线程中运行函数。如果成功则返回true,如果失败则返回false。

示例

pip install ssdp-upnp
    import sys
    from ssdp_upnp.ssdp import Server, Client, Nat
    from ssdp_upnp.ssdp import gen_logger
    from queue import Queue

    logger = gen_logger('sample')

    if __name__ == '__main__':
        try:
            if sys.argv[1] == 'server':
                upnpServer  = Server(8048, 'blockchain', 'main')
                upnpServer.start()
            elif sys.argv[1] == 'client':
                queue = Queue()
                upnpClient = Client('blockchain', 'main', queue)
                upnpClient.start()
                logger.info(queue.get())
            elif sys.argv[1] == 'nat':
                nat = Nat()
                print(nat.addPortForward(8011, 8015))
            else:
                logger.warning('need params server or clinet')
        except Exception as e:
            logger.error(e)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javascript问题:通过URL用网站数据填充Textview   java TabLayout Android,如何用几个标签填充整个屏幕宽度,并用大量标签滚动?   Eclipse Java运行的文件不再存在于我的工作区中   安装两个Java版本时,使用Java的windows链接不起作用   java将多个图形添加到单个JPanel   java Kafka ConsumerFactory,带有两个Desiarizer   使用反射更改java类超类   当一致性测试失败时,java有没有办法让堆栈跟踪显示在控制台中   java映射到基元类型的HashMap的快速替代方案是什么?   java关闭一个jframe所有剩余的打开jframe都将关闭。   java为什么不推荐“使用getString()获取设备标识符”?   java值比较和值赋值之间有什么性能差异吗?   Java实体数组到JavaScript数组   java使用流将一个列表转换为另一个列表   在JTree中保存对象,但更改显示的名称(java swing)?   java“Hello world”Android应用程序,文件尽可能少,没有IDE,只有文本编辑器   java在方法之间传递值   java如何为项目数组创建ParseQuery?