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 asyncio
import websockets
IP_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")
# 接收从客户端发来的消息并处理,再返给客户端ok
async 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 function
if __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 asyncio
import websockets
IP_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 function
if __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