Открытие отдельного сокета во время работы сервера флешек - PullRequest
0 голосов
/ 04 апреля 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...