Python网络编程(八)-python websockets的使用,实现server和client的通信
1. websocket简介:
python3提供了websockets,用于web应用程序,本节介绍websockets相关内容。
2.websockets常用方法:
serve:在server端使用,等待客户端的连接。如果连接成功,返回一个websocket。
connect: 在client端使用,用于建立连接。
send:发送数据,server和client双方都可以使用。
recv:接收数据,server和client双方都可以使用。
close:关闭连接,server和client双方都可以使用。
3.举例:一个简单的测试程序:
程序清单:
Server端代码:
import asyncioimport websocketsIP_ADDR = "127.0.0.1"IP_PORT = "8888"# 握手,通过接收hello,发送"123"来进行双方的握手。async def serverHands(websocket): while True: recv_text = await websocket.recv() print("recv_text=" + recv_text) if recv_text == "hello": print("connected success") await websocket.send("123") return True else: await websocket.send("connected fail")# 接收从客户端发来的消息并处理,再返给客户端okasync def serverRecv(websocket): while True: recv_text = await websocket.recv() print("recv:", recv_text) await websocket.send("ok!!!")# 握手并且接收数据async def serverRun(websocket, path): print(path) await serverHands(websocket) await serverRecv(websocket)#main functionif __name__ == '__main__': print("======server main begin======") server = websockets.serve(serverRun, IP_ADDR, IP_PORT) asyncio.get_event_loop().run_until_complete(server) asyncio.get_event_loop().run_forever()
serve(),用于等待客户端的连接。如果客户端调用connect方法成功,则返回一个websocket。
Client端代码:
import asyncioimport websocketsIP_ADDR = "127.0.0.1"IP_PORT = "8888"# 握手,通过发送hello,接收"123"来进行双方的握手。async def clientHands(websocket): while True: await websocket.send("hello") response_str = await websocket.recv() if "123" in response_str: print("握手成功") return True# 向服务器端发送消息async def clientSend(websocket): while True: input_text = input("input text: ") if input_text == "exit": print(f'"exit", bye!') await websocket.close(reason="exit") return False await websocket.send(input_text) recv_text = await websocket.recv() print(f"{recv_text}")# 进行websocket连接async def clientRun(): ipaddress = IP_ADDR + ":" + IP_PORT async with websockets.connect("ws://" + ipaddress) as websocket: await clientHands(websocket) await clientSend(websocket)#main functionif __name__ == '__main__': print("======client main begin======") asyncio.get_event_loop().run_until_complete(clientRun())
通过调用connect方法与服务的建立通信。
通过发送"hello",接收"123"来进行双方握手的校验,只有握手成功,才可以继续发送和接收数据。
运行结果:
客户端运行结果:
python myclient.py
======client main begin======
握手成功
input text: hello python
ok!!!
input text: hello c
ok!!!
input text: hello java
ok!!!
input text: exit
"exit", bye!Process finished with exit code 0
服务端运行结果:
python myserver.py
======server main begin======
/
recv_text=hello
connected success
recv: hello python
recv: hello c
recv: hello java
connection handler failed
Traceback (most recent call last):
File "/Users/aibook/PycharmProjects/py1/venv/lib/python3.8/site-packages/websockets/legacy/server.py", line 224, in handler
await self.ws_handler(self, path)
File "/Users/aibook/PycharmProjects/py1/myserver.py", line 33, in serverRun
await serverRecv(websocket)
File "/Users/aibook/PycharmProjects/py1/myserver.py", line 23, in serverRecv
recv_text = await websocket.recv()
File "/Users/aibook/PycharmProjects/py1/venv/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 552, in recv
await self.ensure_open()
File "/Users/aibook/PycharmProjects/py1/venv/lib/python3.8/site-packages/websockets/legacy/protocol.py", line 929, in ensure_open
raise self.connection_closed_exc()
websockets.exceptions.ConnectionClosedOK: received 1000 (OK) exit; then sent 1000 (OK) exit