Python Language
WebSockets
Zoeken…
Eenvoudige echo met aiohttp
aiohttp
biedt asynchrone websockets.
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.
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.