File tree 7 files changed +124
-0
lines changed
7 files changed +124
-0
lines changed Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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 ()
Original file line number Diff line number Diff line change
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 ()
Original file line number Diff line number Diff line change
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 ))
Original file line number Diff line number Diff line change
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 ()
You can’t perform that action at this time.
0 commit comments