Python to Python WebSockets with websockets and flask-socket



>问题

所以我需要创建一个可以放在机器上的python应用程序,打开一个websocket管道到运行flask-socketio的服务器,然后将数据传送到服务器。数据将是 json 数据,现在我正在使用字符串进行测试。

我在使用 python 中的"websockets"库连接到我正在制作的"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 FilesAnaconda3libasynciobase_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 FilesAnaconda3libsite-packageswebsocketspy35client.py", line 2, in __aenter__ return await self File "C:Program FilesAnaconda3libsite-packageswebsocketspy35client.py", line 20, in __await_impl__ extra_headers=protocol.extra_headers, File "C:Program FilesAnaconda3libsite-packageswebsocketsclient.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-客户端库

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 FilesAnaconda3libsite-packageswebsocket_core.py", line 226, in connect self.handshake_response = handshake(self.sock, *addrs, **options) File "C:Program FilesAnaconda3libsite-packageswebsocket_handshake.py", line 79, in handshake status, resp = _get_resp_headers(sock) File "C:Program FilesAnaconda3libsite-packageswebsocket_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

结论

一些阅读告诉我我没有正确击中烧瓶中的插座处理程序,但我不确定如何定位它。

任何帮助都非常感谢。我的目标是让一个python脚本与烧瓶插座服务器通信。我没有与其中的任何部分结婚,但更愿意坚持使用服务器的烧瓶。

TIA - 伊恩

你现在可能已经弄清楚了这一点,但问题可能是flask-socketio是一个 Socket.IO 实现,而不是websocket实现。 Socket.IO 使用 websockets 作为其通信协议之一,但您需要一个 Socket.IO 客户端才能连接到 flask-socketio 服务器。

请参阅socketio的文档,特别是:

Socket.IO 不是 WebSocket 实现。虽然确实 Socket.IO 尽可能使用 WebSocket 作为传输,它会添加一些元数据到 每个数据包:数据包类型、命名空间和 ACK ID(当 需要消息确认。这就是为什么 WebSocket 客户端将 无法成功连接到 Socket.IO 服务器,并且 Socket.IO 客户端将无法连接到 WebSocket 服务器 也。

看看这个python Socket.IO 客户端。 https://github.com/miguelgrinberg/python-socketio

最新更新