Python Language
Websockets
Buscar..
Eco simple con aiohttp
aiohttp
proporciona websockets asíncronos.
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())
Clase de envoltura con aiohttp
aiohttp.ClientSession
puede usarse como padre para una clase de WebSocket personalizada.
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()
Usando Autobahn como una Websocket Factory
El paquete Autobahn se puede utilizar para las fábricas de servidores de socket web de Python.
Documentación del paquete Python Autobahn
Para instalar, normalmente uno simplemente usaría el comando de terminal
(Para Linux):
sudo pip install autobahn
(Para ventanas):
python -m pip install autobahn
Luego, se puede crear un servidor de eco simple en un script de Python:
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()
En este ejemplo, se está creando un servidor en el host local (127.0.0.1) en el puerto 9000. Esta es la IP y el puerto de escucha. Esta información es importante, ya que al usar esto, puede identificar la dirección LAN de su computadora y el puerto hacia adelante desde su módem, aunque cualquier enrutador que tenga a la computadora. Luego, utilizando google para investigar su IP WAN, puede diseñar su sitio web para enviar mensajes WebSocket a su IP WAN, en el puerto 9000 (en este ejemplo).
Es importante que retroceda desde su módem, lo que significa que si tiene enrutadores conectados en cadena al módem, ingrese a los ajustes de configuración del módem, transfiera el puerto desde el módem al enrutador conectado, y así sucesivamente hasta el enrutador final de su computadora está conectado está recibiendo la información que se está recibiendo en el puerto de módem 9000 (en este ejemplo).