Suche…


Einfaches Echo mit aiohttp

aiohttp stellt asynchrone aiohttp bereit.

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-Klasse mit aiohttp

aiohttp.ClientSession kann als übergeordnetes aiohttp.ClientSession für eine benutzerdefinierte WebSocket-Klasse verwendet werden.

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 als Websocket-Fabrik nutzen

Das Autobahn-Paket kann für Python-Websocket-Serverfabriken verwendet werden.

Python Autobahnpaket-Dokumentation

Zur Installation wird normalerweise der Befehl terminal verwendet

(Für Linux):

sudo pip install autobahn

(Für Windows):

python -m pip install autobahn

Dann kann ein einfacher Echo-Server in einem Python-Skript erstellt werden:

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 diesem Beispiel wird auf dem localhost (127.0.0.1) an Port 9000 ein Server erstellt. Dies ist die zu überwachende IP-Adresse und der Port. Dies ist eine wichtige Information, da Sie damit die LAN-Adresse Ihres Computers und die Weiterleitung des Ports von Ihrem Modem aus identifizieren können, unabhängig davon, welche Router Sie zum Computer haben. Anschließend können Sie mithilfe von Google Ihre WAN-IP-Adresse untersuchen. Sie können Ihre Website so einrichten, dass WebSocket-Nachrichten an Port 9000 (in diesem Beispiel) an Ihre WAN-IP-Adresse gesendet werden.

Es ist wichtig, dass Sie von Ihrem Modem aus einen Port-Forward-Vorgang durchführen, dh, wenn Sie Router an das Modem angeschlossen haben, geben Sie die Konfigurationseinstellungen des Modems ein, den Port-Forwarder vom Modem zum angeschlossenen Router usw. bis zum endgültigen Router Ihres Computers verbunden ist, wird die Information über den Modemport 9000 (in diesem Beispiel) an ihn weitergeleitet.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow