2017-10-30 3 views
1

Ich versuche, eine Web-Socket-Verbindung zu einem Server herzustellen und in Empfangsmodus. Sobald der Client die Daten empfängt, schließt es sofort die Verbindung mit AusnahmeWeb Sockets Client wirft eine Ausnahme, sobald es beginnt, Daten zu empfangen

webSoc_Received = await websocket.recv() 
    File "/root/envname/lib/python3.6/site-packages/websockets/protocol.py", line 319, in recv 
    raise ConnectionClosed(self.close_code, self.close_reason) 
websockets.exceptions.ConnectionClosed: WebSocket connection is closed: code = 1007, no reason. 

clientseitigen Code Snippet:

import asyncio 
import websockets 

async def connect_ws(): 

    print("websockets.client module defines a simple WebSocket client API::::::")   
    async with websockets.client.connect(full_url,extra_headers=headers_conn1) as websocket: 

     print ("starting") 
     webSoc_Received = await websocket.recv() 
     print ("Ending") 
     Decode_data = zlib.decompress(webSoc_Received)  
     print(Decode_data) 

asyncio.get_event_loop().run_until_complete(connect_ws()) 

Irgendwelche Gedanken dazu?

Antwort

0

Sie verwenden run_until_complete(), die abgeschlossen wird, sobald Sie den Prozess gestartet haben.
Stattdessen sollten Sie .run_forever() verwenden. Es wird Ihren Sockel offen halten, bis Sie ihn schließen.
EDIT:
Sie können dies so etwas wie tun:

loop = asyncio.get_event_loop() 
loop.call_soon(connect_ws) # Calls connect_ws once the event loop starts 
loop.run_forever() 

Oder:

loop = asyncio.get_event_loop() 
loop.run_until_complete(connect_ws()) 
loop.run_forever() 

Oder wenn frühere Beispiele nicht erfolgreich sind, können Sie mit folgendem Code versuchen:

import asyncio 

@asyncio.coroutine 
def periodic(): 
    while True: 
    print("websockets.client module defines a simple WebSocket client API::::::")   
    with websockets.client.connect(full_url,extra_headers=headers_conn1) as websocket: 
     print ("starting") 
     webSoc_Received = websocket.recv() 
     print ("Ending") 
     Decode_data = zlib.decompress(webSoc_Received)  
     print(Decode_data) 

def stop(): 
    task.cancel() 

task = asyncio.Task(periodic()) 
loop = asyncio.get_event_loop() 
loop.call_later(5, stop) 

try: 
    loop.run_until_complete(task) 
except asyncio.CancelledError: 
    pass 
+0

Danke, aber seine Wurf Fehler wie ich auch Funktion innerhalb dieses nennen asyncio.get_event_loop() .run_forever (connect_ws()) TypeError: run_forever() nimmt 1 Positionsargument, aber 2 wurden gegeben. Irgendeine Idee zu diesem Teil? – CoolNetworking

+0

@CoolNetworking siehe meinen aktualisierten Beitrag. – Grynets

+0

Mit der ersten Methode bleibt es einfach stecken und empfängt niemals Daten und bleibt unterhalb von /usr/local/lib/python3.6/asyncio/events.py:127: RuntimeWarning: Coroutine 'connect_ws' wurde nie erwartet self._callback (* self._args). Bei der zweiten ist es das gleiche Verhalten, es läuft nie für immer – CoolNetworking

0

Von dem, was ich sagen kann, wird Ihr aktueller Code beendet, nachdem er empfangen hat es ist seine erste Nachricht.

Versuchen Sie, Ihren Code zu einem Verbraucher-Muster zu ändern, wie hier in den websocket docs erwähnt:

https://websockets.readthedocs.io/en/stable/intro.html#common-patterns

import asyncio 
import websockets 

async def connect_ws(): 
     print("websockets.client module defines a simple WebSocket client API::::::")  
     async with websockets.client.connect(full_url,extra_headers=headers_conn1) as websocket: 
       while True: 
         print ("starting") 
         webSoc_Received = await websocket.recv() 
         print ("Ending") 
         Decode_data = zlib.decompress(webSoc_Received)  
         print(Decode_data) 
Verwandte Themen