#python #sockets #flask #websocket #socket.io
#python #сокеты #flask #websocket #socket.io
Вопрос:
Я пытаюсь написать приложение Flask, в котором клиенты подключаются через сокет на простом веб-сайте, и которое также взаимодействует с другим процессом (на том же компьютере), также с сокетом.
Я, вероятно, веду себя глупо, но я новичок в сокетах и с трудом разбираюсь в документации / других сообщениях SO об этом. Извините, если это плохой вопрос!
Итак, у меня есть три файла (в этой упрощенной версии):
index.html
, который открывает сокет для сервера Flask на порту 5000.
app.py
, который запускает приложение flask как объект socketio на порту 5000 и подключается к серверной части на порту 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’) вызывается правильно, и «полученное сообщение Hello world» распечатывается на app.py процесс. Однако отправка не работает. В серверном процессе он зависает при conn.recv
вызове.
Я поискал в Google, и кажется, что это связано с тем, что Flask изменяет способ обработки сокетов или что-то в этом роде, но, честно говоря, я не мог понять, какие ответы я нашел.
Я бы действительно хотел сделать это без использования отдельного потока (для меня не имеет смысла, что вам понадобится поток, когда у меня уже есть отдельные процессы), но все работает нормально. Больше интересует понимание того, в чем проблема, чем ее исправление!