我正在尝试编写一个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改变了套接字的处理方式或其他事情有关,但老实说,我无法在发现的答案中走出正轨。
我真的很想在不使用单独线程的情况下执行此操作(对我来说,当我已经有单独的进程时,您需要一个线程是没有意义的),但是任何可行的方法都可以。比解决问题更感兴趣于了解问题是什么!