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()

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

  • 相关阅读:
    移动应用跨平台之旅
    ReactNative之坑爹的在线安装
    关于拆箱装箱引发的类型转换报错
    Unity HDR (高动态范围 )
    Instruments如何看Mono内存分配
    Unity编辑器崩溃大全
    Unity3D获取手机存储空间
    关于构建AssetBundle哈希冲突的问题
    关于UnityWebRequest的超时讨论
    Wwise音频插件介绍
  • 原文地址:https://www.cnblogs.com/xuanmanstein/p/11958863.html
Copyright © 2011-2022 走看看