Skip to content

Commit 0bee513

Browse files
committed
git init
1 parent bd40004 commit 0bee513

File tree

7 files changed

+124
-0
lines changed

7 files changed

+124
-0
lines changed

requirements.txt

Whitespace-only changes.

websoctet_lab/README.md

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# websocket_lab
2+
3+
4+
5+
6+
7+
8+
## 参考资料
9+
- https://medium.com/better-programming/how-to-create-a-websocket-in-python-b68d65dbd549
10+
- https://www.ruanyifeng.com/blog/2017/05/websocket.html

websoctet_lab/__init__.py

Whitespace-only changes.

websoctet_lab/consumer.py

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# coding: utf-8
2+
# @Time : 2020/9/15 9:12 AM
3+
4+
import asyncio
5+
import websockets
6+
from websockets import WebSocketClientProtocol
7+
from loguru import logger
8+
9+
10+
async def consumer_handler(websocket: WebSocketClientProtocol) -> None:
11+
async for message in websocket:
12+
log_message(message)
13+
14+
15+
async def cousume(hostname: str, port: int) -> None:
16+
websocket_resource_url = f"ws://{hostname}:{port}"
17+
async with websockets.connect(websocket_resource_url) as websocket:
18+
await consumer_handler(websocket)
19+
20+
21+
def log_message(message: str) -> None:
22+
logger.info(f"Message: {message}")
23+
24+
25+
if __name__ == '__main__':
26+
loop = asyncio.get_event_loop()
27+
loop.run_until_complete(cousume("127.0.0.1", 4000))
28+
loop.run_forever()

websoctet_lab/cousumer_2.py

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# coding: utf-8
2+
# @Time : 2020/9/15 9:17 AM
3+
4+
import asyncio
5+
import websockets
6+
from websockets import WebSocketClientProtocol
7+
from loguru import logger
8+
9+
10+
async def consumer_handler(websocket: WebSocketClientProtocol) -> None:
11+
async for message in websocket:
12+
log_message(message)
13+
14+
15+
async def cousume(hostname: str, port: int) -> None:
16+
websocket_resource_url = f"ws://{hostname}:{port}"
17+
async with websockets.connect(websocket_resource_url) as websocket:
18+
await consumer_handler(websocket)
19+
20+
21+
def log_message(message: str) -> None:
22+
logger.info(f"Message: {message}")
23+
24+
25+
if __name__ == '__main__':
26+
loop = asyncio.get_event_loop()
27+
loop.run_until_complete(cousume("127.0.0.1", 4000))
28+
loop.run_forever()

websoctet_lab/producer.py

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# coding: utf-8
2+
# @Time : 2020/9/15 8:42 AM
3+
4+
import asyncio
5+
import websockets
6+
7+
8+
async def produce(message: str, host: str, port: int) -> None:
9+
async with websockets.connect(f"ws://{host}:{port}") as ws:
10+
await ws.send(message)
11+
await ws.recv()
12+
13+
14+
if __name__ == '__main__':
15+
asyncio.run(produce("hi", "127.0.0.1", 4000))

websoctet_lab/server.py

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# coding: utf-8
2+
# @Time : 2020/9/15 8:59 AM
3+
4+
import asyncio
5+
import websockets
6+
from websockets import WebSocketServerProtocol
7+
8+
from loguru import logger
9+
10+
11+
class Server:
12+
clients = set()
13+
14+
async def register(self, ws: WebSocketServerProtocol) -> None:
15+
self.clients.add(ws)
16+
logger.info(f"{ws.remote_address} connects.")
17+
18+
async def unregister(self, ws: WebSocketServerProtocol) -> None:
19+
self.clients.remove(ws)
20+
logger.info(f"{ws.remote_address} disconnects.")
21+
22+
async def send_to_clients(self, message: str) -> None:
23+
if self.clients:
24+
await asyncio.wait([client.send(message) for client in self.clients])
25+
26+
async def ws_handler(self, ws: WebSocketServerProtocol, uri: str) -> None:
27+
await self.register(ws)
28+
try:
29+
await self.distribute(ws)
30+
finally:
31+
await self.unregister(ws)
32+
33+
async def distribute(self, ws: WebSocketServerProtocol) -> None:
34+
async for message in ws:
35+
await self.send_to_clients(message)
36+
37+
38+
if __name__ == '__main__':
39+
server = Server()
40+
start_server = websockets.serve(server.ws_handler, "127.0.0.1", 4000)
41+
loop = asyncio.get_event_loop()
42+
loop.run_until_complete(start_server)
43+
loop.run_forever()

0 commit comments

Comments
 (0)