> 文档中心 > Python网络编程(八)-python websockets的使用,实现server和client的通信

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