zoukankan      html  css  js  c++  java
  • python socket.io 坑。

    python下star最高的是https://github.com/miguelgrinberg/python-socketio

    是flask作者写的。client server都有了,而且还提供了async版本。但是怎么说呢,用起来有坑!

    1文档太简略。

    2 它的客户端和服务器端,在win下启动后,都不能及时响应键盘ctrl+C退出。要等很久很久。

    而把它包装进Process,然后

    p.daemon = True 

    设置为守护进程,这样主进程退出,就能正常退出了。

    以服务器端为例,客户端同理

    from multiprocessing import Process
    import signal
    import sys
    
    import eventlet
    import socketio
    
    clients = {}
    
    
    def run(port):
        sio = socketio.Server()
        app = socketio.WSGIApp(sio, static_files={
            '/': {'content_type': 'text/html', 'filename': 'index.html'}
        })
    
        @sio.event
        def connect(sid, environ):
            print('connect ', sid)
    
    
        @sio.event
        def disconnect(sid):
            print('disconnect ', clients[sid])
    
    
        print('启动服务器', port)
        eventlet.wsgi.server(eventlet.listen(('', port)), app)
    
    
    
    if __name__ == '__main__':
        p=Process(target=run,args=(9090,))
    p.daemon = True p.start()
    #p.terminate() print('主进程启动') def signal_handler(signal, frame): print('关闭从进程') #p.terminate() print('主进程退出') sys.exit(0) signal.signal(signal.SIGINT,signal_handler) while True: pass

    但是client 属于强退。clietn退出后N久,才回在服务器端显示:

    “ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。”

    但是,不论客户端还是服务器端,都没有响应到disconnect, 因为根本就不是正常退出的

    而且用Process 的方法,还有个问题,就是占用主机CPU,主进程始终在死循环。直接站走1个CPU,太坑了。

    解决方法:

        sio = socketio.Client()
    
        @sio.event
        def connect():
            print("I'm connected!")
            sio.emit('auth_mobile', {'ip': get_host_ip(), 'hardware': hardware_info})
    
        @sio.event
        def disconnect():
            print("I'm disconnected!")
    
        try:
            sio.connect(f'http://{ip_admin}:{port}')
            #sio.wait()
        except socketio.exceptions.ConnectionError:
            print('连接admin失败')

    不使用sio.wait()

    就可以正常退出了,而且暂时没发现问题

  • 相关阅读:
    EF数据迁移完整步骤
    ajax跨域最全解决方案
    WPF控件与WPF窗体
    WPF模板是把控件MVC模式化
    对象与类型
    Java加权负载均衡策略
    db2列式存储
    linux离线安装mongodb及java调用
    python合并目录下excel数据
    python多线程迁移db2数仓9T数据
  • 原文地址:https://www.cnblogs.com/xuanmanstein/p/11958863.html
Copyright © 2011-2022 走看看