2

我相当有信心这是一个新问题,这有点令人不安,但如果之前已经解决了这个问题,请告诉我。我也只是从 websockets 开始。我知道 socket.io 和普通 websockets 之间的区别。我尝试将前者用于流式传输 jpeg 数据,但它不能胜任任务(我正在寻找 30 fps,并且在保持连接不到一分钟后会出现巨大的延迟峰值)我找到了这篇文章,所以我没有继续进行。 https://github.com/socketio/socket.io/issues/1175

https://github.com/TwilioDevEd/mediastreams-consume-websockets-flask/blob/master/app.py教我如何设置flask-sockets 后端和https://medium.com/@ssaurel/learn- to-use-websockets-on-android-with-okhttp-ba5f00aea988教会了我 okhttp3。另请注意,我使用 okhttp3 的唯一原因是因为我知道它,并假设 websockets 可以与客户端/服务器一起使用,但事实并非如此。

这是 okhttp3 客户端上 onFailure 监听器的打印输出。

failed to connect: Failed to connect /localip:5000

在服务器端,我可以报告没有建立连接。

这是我在后端的代码。(打算通过 websocket 发送 jpeg 帧,因此是相机对象)

HTTP_SERVER_PORT = 5000
camera = Camera(app, './get.py', 960, 720)
socket = SocketLocal(app, camera)
thread = None

@sockets.route('/data')
def echo(ws):
    app.logger.info("Connected accepted")
    has_seen_media = False
    #send through to client
    while not ws.closed:
        gevent.sleep(0.1)
        try:
            data = gevent.with_timeout(0.1, ws.receive, timeout_value="")
            if data is None:
                raise Exception("socket closed")
        except:
            break
        message = ws.receive()
        if message is None:
            app.logger.info("No message received...")
            continue

        data = loads("message")
        if data['event'] == "connected":
            app.logger.info("Connected Message Received: {}".format(message))
        if data['event'] == "start":
            app.logger.info("Start Message received: {}".format(message))
        if data['event'] == "media":
            global socket
            global thread

            socket.ws = ws
            thread = threading.Thread(target=socket._camerathread)
            thread.start()
        if data['event'] == 'closed':
            app.logger.info("Closed Message received: {}".format(message))
            break

    thread = None
    app.logger.info("Connection closed")

if __name__== "__main__":
    #app.run(host='0.0.0.0', threaded=True)
    config['thermal']['url'] = url_for('video_feed')
    from gevent import pywsgi
    from geventwebsocket.handler import WebSocketHandler

    server = pywsgi.WSGIServer(('', HTTP_SERVER_PORT), app, handler_class=WebSocketHandler)
    server.serve_forever()

我正在通过 gunicorn 运行烧瓶后端。我使用的命令直接来自烧瓶套接字页面。

gunicorn -k flask_sockets.worker --access-logfile gunicorn_access.log --error-logfile gunicorn_error.log --log-level=debug wsgi:application

如果有更好的方法可以做到这一点,那么我会全力以赴。

4

0 回答 0