Я пытаюсь написать приложение Flask, в котором клиенты подключаются через сокет на простом веб-сайте и которое также взаимодействует с другим процессом (на той же машине), также с сокетом.
Я, наверное, глупый, но я новичок в сокетах, и мне трудно разобраться в документации / других постах SO. Извините, если это плохой вопрос!
Итак, у меня есть три файла (в этой упрощенной версии):
index.html
, который открывает сокет для сервера Flask на порту 5000.
app.py
, который запускает приложение фляги как объект socketio на порту 5000 и подключается к бэкэнду на порту 5500.
backend.py
, который открывает сокет на порту 5500
и просто распечатывает все, что получает.
Мой HTML / JS довольно прост (с помощью socket.io):
s = io.connect('ws://localhost:5000');
s.emit('message', {'data': 'Hello world'});
Моя цель - заставить Hello World пройти через приложение фляги и на внутренний сервер. Я думаю, что бэкэнд-сервер в порядке, он просто ждет получения данных, а затем распечатывает их.
# 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 изменил способ обработки сокетов или что-то в этом роде, но, честно говоря, я не мог придумать ответы, которые нашел.
Я бы действительно хотел сделать это без использования отдельного потока (для меня не имеет смысла, что вам нужен поток, когда у меня уже есть отдельные процессы), но все, что работает, хорошо. Больше интересует понимание проблемы, чем ее решение!