Открытие отдельного сокета при запуске сервера flask socketio

#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 изменяет способ обработки сокетов или что-то в этом роде, но, честно говоря, я не мог понять, какие ответы я нашел.

Я бы действительно хотел сделать это без использования отдельного потока (для меня не имеет смысла, что вам понадобится поток, когда у меня уже есть отдельные процессы), но все работает нормально. Больше интересует понимание того, в чем проблема, чем ее исправление!