Python to Python WebSockets с веб-сокетами и флешкой - PullRequest
1 голос
/ 05 апреля 2019

Задача

Итак, мне нужно создать приложение на python, которое может сидеть на машине, открыть канал веб-сокета для сервера, на котором выполняется flask-socketio, а затем передать данные на сервер. Данные будут JSON, сейчас я тестирую с помощью строки.

У меня проблема с использованием библиотеки 'websockets' в python для подключения к бэкэнду 'flask-socketio', который я делаю.

Код

Сервер

from flask import Flask, render_template, request, url_for, 

copy_current_request_context
from flask_socketio import SocketIO, emit
import logging

logging.basicConfig()

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
app.config['DEBUG'] = True
socketio = SocketIO(app)


@socketio.on('connect', namespace='/')
def connect():
    print('Client connected')


@socketio.on('disconnect', namespace='/')
def disconnect():
    print('Client disconnected')


if __name__ == '__main__':
    socketio.run(app, debug=True)

Клиент 1 - библиотека веб-сокетов

import asyncio
import websockets

async def hello():
    async with websockets.connect(
            'ws://127.0.0.1:5000') as websocket:
        name = 'joe'  # input("What's your name? ")

        await websocket.send('message', name)
        print(f"> {name}")

        greeting = await websocket.recv()
        print(f"< {greeting}")

asyncio.get_event_loop().run_until_complete(hello())

print("end")

Использовать вывод

Когда я использую клиент 1, я получаю это как вывод на клиентском процессе: Traceback (most recent call last): File "C:/project_files/aWebUAS/micro-services/New-Capabilities-Investigation/web_socket_client.py", line 15, in <module> asyncio.get_event_loop().run_until_complete(hello()) File "C:\Program Files\Anaconda3\lib\asyncio\base_events.py", line 466, in run_until_complete return future.result() File "C:/project_files/aWebUAS/micro-services/New-Capabilities-Investigation/web_socket_client.py", line 6, in hello 'ws://127.0.0.1:5000') as websocket: File "C:\Program Files\Anaconda3\lib\site-packages\websockets\py35\client.py", line 2, in __aenter__ return await self File "C:\Program Files\Anaconda3\lib\site-packages\websockets\py35\client.py", line 20, in __await_impl__ extra_headers=protocol.extra_headers, File "C:\Program Files\Anaconda3\lib\site-packages\websockets\client.py", line 286, in handshake raise InvalidStatusCode(status_code) websockets.exceptions.InvalidStatusCode: Status code not 101: 404

а по колбе процесс вижу:
127.0.0.1 - - [2019-04-05 09:17:13] "GET / HTTP/1.1" 404 342 0.000999

Клиент 2 - библиотека websocket-client

import websocket
ws = websocket.WebSocket()
ws.connect("ws://127.0.0.1:5000")
ws.send("Hello, World")

Использовать вывод

На клиентском процессе 2 я получаю это как вывод: Traceback (most recent call last): File "C:/project_files/aWebUAS/micro-services/New-Capabilities-Investigation/web_socket_client_2.py", line 3, in <module> ws.connect("ws://127.0.0.1:5000") File "C:\Program Files\Anaconda3\lib\site-packages\websocket\_core.py", line 226, in connect self.handshake_response = handshake(self.sock, *addrs, **options) File "C:\Program Files\Anaconda3\lib\site-packages\websocket\_handshake.py", line 79, in handshake status, resp = _get_resp_headers(sock) File "C:\Program Files\Anaconda3\lib\site-packages\websocket\_handshake.py", line 160, in _get_resp_headers raise WebSocketBadStatusException("Handshake status %d %s", status, status_message, resp_headers) websocket._exceptions.WebSocketBadStatusException: Handshake status 404 NOT FOUND

и процесс в колбе показывает это:
127.0.0.1 - - [2019-04-05 09:11:57] "GET / HTTP/1.1" 404 342 0.001000

Заключение

Некоторые читатели говорят, что я не попал в обработчик socketio внутри колбы должным образом, но я не уверен, как нацеливаться на это.

Любая помощь очень ценится. Моя цель состоит в том, чтобы скрипт Python говорил с сервером socketio для фляг. Я не женат на какой-либо части этого, но предпочел бы придерживаться колбу для сервера.

TIA - Ian

1 Ответ

0 голосов
/ 07 июня 2019

Возможно, вы уже поняли это, но проблема, вероятно, заключается в том, что flask-socketio является реализацией Socket.IO, а не реализацией websocket.Socket.IO использует websockets в качестве одного из своих протоколов связи, но вам потребуется клиент Socket.IO для подключения к серверу flask-socketio.

См. документы socketio , в частности:

Socket.IO НЕ является реализацией WebSocket.Хотя Socket.IO действительно использует WebSocket в качестве транспорта, когда это возможно, он добавляет некоторые метаданные к каждому пакету: тип пакета, пространство имен и идентификатор подтверждения, когда требуется подтверждение сообщения.Вот почему клиент WebSocket не сможет успешно подключиться к серверу Socket.IO, а клиент Socket.IO также не сможет подключиться к серверу WebSocket.

Посмотритена этом клиенте Python Socket.IO.https://github.com/miguelgrinberg/python-socketio

...