Zoeken…


Eenvoudige echo met aiohttp

aiohttp biedt asynchrone websockets.

Python 3.x 3.5
import asyncio
from aiohttp import ClientSession

with ClientSession() as session:
    async def hello_world():

        websocket = await session.ws_connect("wss://echo.websocket.org")

        websocket.send_str("Hello, world!")

        print("Received:", (await websocket.receive()).data)

        await websocket.close()

    loop = asyncio.get_event_loop()
    loop.run_until_complete(hello_world())

Wrapper Class met aiohttp

aiohttp.ClientSession kan worden gebruikt als ouder voor een aangepaste WebSocket-klasse.

Python 3.x 3.5
import asyncio
from aiohttp import ClientSession

class EchoWebSocket(ClientSession):

    URL = "wss://echo.websocket.org"

    def __init__(self):
        super().__init__()
        self.websocket = None

    async def connect(self):
        """Connect to the WebSocket."""
        self.websocket = await self.ws_connect(self.URL)

    async def send(self, message):
        """Send a message to the WebSocket."""
        assert self.websocket is not None, "You must connect first!"
        self.websocket.send_str(message)
        print("Sent:", message)

    async def receive(self):
        """Receive one message from the WebSocket."""
        assert self.websocket is not None, "You must connect first!"
        return (await self.websocket.receive()).data

    async def read(self):
        """Read messages from the WebSocket."""
        assert self.websocket is not None, "You must connect first!"

        while self.websocket.receive():
            message = await self.receive()
            print("Received:", message)
            if message == "Echo 9!":
                break

async def send(websocket):
    for n in range(10):
        await websocket.send("Echo {}!".format(n))
        await asyncio.sleep(1)

loop = asyncio.get_event_loop()

with EchoWebSocket() as websocket:

    loop.run_until_complete(websocket.connect())

    tasks = (
        send(websocket),
        websocket.read()
    )

    loop.run_until_complete(asyncio.wait(tasks))

    loop.close()

Autobahn gebruiken als een Websocket-fabriek

Het Autobahn-pakket kan worden gebruikt voor Python-websocketserverfabrieken.

Python Autobahn-pakketdocumentatie

Om te installeren, zou men meestal eenvoudigweg het terminalcommando gebruiken

(Voor Linux):

sudo pip install autobahn

(Voor ramen):

python -m pip install autobahn

Vervolgens kan een eenvoudige echoserver worden gemaakt in een Python-script:

from autobahn.asyncio.websocket import WebSocketServerProtocol
class MyServerProtocol(WebSocketServerProtocol):
    '''When creating server protocol, the
    user defined class inheriting the 
    WebSocketServerProtocol needs to override
    the onMessage, onConnect, et-c events for 
    user specified functionality, these events 
    define your server's protocol, in essence'''
    def onMessage(self,payload,isBinary):
        '''The onMessage routine is called 
        when the server receives a message.
        It has the required arguments payload 
        and the bool isBinary. The payload is the 
        actual contents of the "message" and isBinary
        is simply a flag to let the user know that 
        the payload contains binary data. I typically 
        elsewise assume that the payload is a string.
        In this example, the payload is returned to sender verbatim.'''
        self.sendMessage(payload,isBinary)
if__name__=='__main__':
    try:
        importasyncio
    except ImportError:
        '''Trollius = 0.3 was renamed'''
        import trollius as asyncio
    from autobahn.asyncio.websocketimportWebSocketServerFactory
    factory=WebSocketServerFactory()
    '''Initialize the websocket factory, and set the protocol to the 
    above defined protocol(the class that inherits from 
    autobahn.asyncio.websocket.WebSocketServerProtocol)'''
    factory.protocol=MyServerProtocol
    '''This above line can be thought of as "binding" the methods
    onConnect, onMessage, et-c that were described in the MyServerProtocol class
    to the server, setting the servers functionality, ie, protocol'''
    loop=asyncio.get_event_loop()
    coro=loop.create_server(factory,'127.0.0.1',9000)
    server=loop.run_until_complete(coro)
    '''Run the server in an infinite loop'''
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        server.close()
        loop.close()

In dit voorbeeld wordt een server gemaakt op de localhost (127.0.0.1) op poort 9000. Dit is de luister-IP en poort. Dit is belangrijke informatie, omdat u hiermee het LAN-adres van uw computer en poort-forward van uw modem kunt identificeren, ongeacht welke routers u naar de computer hebt. Vervolgens kunt u Google gebruiken om uw WAN IP te onderzoeken, zodat u uw website kunt ontwerpen om WebSocket-berichten naar uw WAN IP te verzenden, op poort 9000 (in dit voorbeeld).

Het is belangrijk dat u port forward van uw modem terug, wat betekent dat als u routers in serie hebt gekoppeld aan de modem, voert u de configuratie-instellingen van de modem in, port forward van de modem naar de verbonden router, enzovoort tot de laatste router van uw computer is verbonden met de informatie die wordt ontvangen op modempoort 9000 (in dit voorbeeld) wordt doorgestuurd.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow