Как асинхронно отправлять и получать сообщения веб-сокета с помощью PythonPython

Программы на Python
Ответить
Anonymous
 Как асинхронно отправлять и получать сообщения веб-сокета с помощью Python

Сообщение Anonymous »

Как отправлять и получать сообщения с помощью pythons asyncio и библиотеки веб-сокетов?
Я использую каналы Django в качестве сервера сокетов. Итак, по сути, я пытаюсь отправлять и получать сообщения с этого сокет-сервера.
Я могу легко отправлять сообщения на свой веб-сервер, используя:

Код: Выделить всё

#!/usr/bin/python3

async def main():
uri = f"{wsPrefix}stream/{machineSerial}/?{token}"
async with websockets.connect(uri, ping_interval = None) as websocket:
try:
cap = acapture.open(0)
except:
asyncio.sleep(1)
cap = acapture.open(0)
while True:
check,frame = cap.read()
if not websocket.open:
print("### reconnecting ###")
await websockets.connect(uri,ping_interval = None)
if check:
frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
check, jpeg = cv2.imencode('.jpg', frame)
frame = jpeg.tobytes()
frame = bytearray(frame)
await websocket.send(frame)
await asyncio.sleep(0.05)

if __name__ == "__main__":
import websockets
import asyncio
import acapture
import cv2
from deviceSpecificVals import machineSerial, token
import deviceSpecificVals.url

urlPrefix = deviceSpecificVals.url
wsPrefix = deviceSpecificVals.wsPrefix

asyncio.run(main())
Но как добавить сюда еще одну асинхронную функцию, чтобы всегда прослушивать сообщения? Я хочу, чтобы получатель завершил выполнение сценария и закрылся, когда получит сообщение о закрытии.
Я пробовал:

Код: Выделить всё

#!/usr/bin/python3

async def connect():
uri = f"{wsPrefix}stream/{machineSerial}/?{token}"
async with websockets.connect(uri, ping_interval = None) as websocket:
return websocket

async def rcv(websocket):
while True:
msg = await websocket.recv()
print(f"< {msg}")

async def send(websocket):
uri = f"{wsPrefix}stream/{machineSerial}/?{token}"
try:
cap = acapture.open(0)
except:
asyncio.sleep(1)
cap = acapture.open(0)
while True:
check,frame = cap.read()
if not websocket.open:
print("### reconnecting ###")
await websockets.connect(uri,ping_interval = None)
if check:
frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
check, jpeg = cv2.imencode('.jpg', frame)
frame = jpeg.tobytes()
frame = bytearray(frame)
await websocket.send(frame)
await asyncio.sleep(0.05)

async def main():
websocket = await connect()
asyncio.ensure_future(send(websocket))
asyncio.ensure_future(rcv(websocket))
await asyncio.sleep(100000)

if __name__ == "__main__":
import websockets
import asyncio
import acapture
import cv2
from deviceSpecificVals import machineSerial, token
import deviceSpecificVals.url

urlPrefix = deviceSpecificVals.url
wsPrefix = deviceSpecificVals.wsPrefix

asyncio.run(main())
Это не будет подключаться к веб-сокету, это почти как если бы функция подключения не возвращала объект веб-сокета. Я также очень новичок в асинхронности и пытаюсь понять, что здесь происходит

Подробнее здесь: https://stackoverflow.com/questions/677 ... ith-python
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»