Python Language
Gniazda sieciowe
Szukaj…
Proste echo z aiohttp
aiohttp
zapewnia asynchroniczne aiohttp
.
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())
Klasa opakowania z aiohttp
aiohttp.ClientSession
może być używany jako element nadrzędny dla niestandardowej klasy WebSocket.
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()
Używanie Autobahn jako fabryki Websocket
Pakiet Autobahn może być używany dla fabryk serwerów gniazd internetowych Python.
Dokumentacja pakietu Python Autobahn
Aby zainstalować, zwykle wystarczy użyć polecenia terminalu
(Dla systemu Linux):
sudo pip install autobahn
(Dla Windowsa):
python -m pip install autobahn
Następnie można utworzyć prosty serwer echa w skrypcie 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()
W tym przykładzie serwer lokalny jest tworzony na hoście lokalnym (127.0.0.1) na porcie 9000. To jest nasłuchujący adres IP i port. Jest to ważna informacja, ponieważ przy jej użyciu możesz zidentyfikować adres LAN komputera i port przekierowania z modemu, niezależnie od tego, jakie masz routery do komputera. Następnie, używając Google do sprawdzenia twojego adresu WAN, możesz zaprojektować swoją stronę internetową, aby wysyłała wiadomości WebSocket do twojego adresu WAN na porcie 9000 (w tym przykładzie).
Ważne jest, aby przekierować z powrotem z modemu z powrotem, co oznacza, że jeśli masz routery podłączone do modemu, wejdź w ustawienia konfiguracji modemu, przekieruj z modemu do podłączonego routera i tak dalej, aż do ostatniego routera na komputerze jest podłączony, do którego przesyłane są informacje odbierane przez port modemu 9000 (w tym przykładzie).