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 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
 

来源:liranke

物联沃分享整理
物联沃-IOTWORD物联网 » Python网络编程(八)-python websockets的使用,实现server和client的通信

发表评论