运行flask socketio服务器时打开单独的套接字

时间:2019-04-04 17:49:49

标签: python sockets flask websocket socket.io

我正在尝试编写一个Flask应用程序,在该应用程序中,客户端通过简单网站上的套接字进行连接,并且还通过套接字与其他进程(在同一台计算机上)通信。

我可能很傻,但是对套接字来说是新手,并且很难理解文档或其他SO帖子。不好意思,不好意思!

所以我有三个文件(在此简化版本中):

index.html,它将在端口5000上打开Flask服务器的套接字。

app.py,它在5000端口上将flask应用程序作为socketio对象运行,并连接到5500端口上的后端。

backend.py,它将在端口5500上打开一个套接字,并仅打印出接收到的内容。

我的HTML / JS非常简单(使用socket.io):

 s = io.connect('ws://localhost:5000');
 s.emit('message', {'data': 'Hello world'});

我的目标是让“ Hello world”通过flask应用程序传递到后端服务器。我认为后端服务器很好,它只是等待接收数据然后将其打印出来。

# backend.py, server
HOST = '127.0.0.1'
PORT = 5500

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
    conn, addr = s.accept()
    with conn:
        print('Connected to ' + repr(addr))
        while True:
            print('Receiving data...')
            data = conn.recv(1024).decode()
            print('Data received: ' + data)
            if data == 'STOP' or not data:
                break

print('Exiting server')

这是我的app.py:

# app.py, client and server
HOST = '127.0.0.1'
PORT = 5500

app = Flask(__name__)
socketio = SocketIO(app)
backend_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
backend_socket.connect((HOST, PORT))

@app.route('/')
def main():
    return render_template('index.html')

@socketio.on('message')
def message(msg):
    print('received message ' + msg['data'])
    backend_socket.sendall(bytes(msg['data']))

if __name__ == '__main__':
    socketio.run(app, port=5000, debug=True)

出了什么问题:发出消息时,将正确调用.on('message')路由,并在app.py进程中打印出“接收到的消息Hello world”。但是,sendall不起作用。在后端过程中,它挂在conn.recv调用上。

我已经四处搜寻,看来这与Flask改变了套接字的处理方式或其他事情有关,但老实说,我无法在发现的答案中走出正轨。

我真的很想在不使用单独线程的情况下执行此操作(对我来说,当我已经有单独的进程时,您需要一个线程是没有意义的),但是任何可行的方法都可以。比解决问题更感兴趣于了解问题是什么!

0 个答案:

没有答案