什么是 WebSocket?
WebSocket 允许两个实体之间通过单个 TCP 连接进行双向通信(双向)。这意味着 WebSocket 客户端和服务器可以在单个连接中多次交互。
Websocket 连接是一种全双工连接协议,这意味着数据可以在两个方向上同时发送和接收,从而保持连接处于活动状态,直到服务器或客户端决定停止连接。它用于实时应用程序,以在两个方向上交换低延迟数据。
如何使用 Python 创建 WebSocket
安装websockets
打开终端窗口并运行以下命令:
pip install websockets |
创建 WebSocket 服务器
创建一个 WebSocket 服务器,该服务器将从客户端检索值,并基于这些值向客户端发送相应的响应。
import websockets
import asyncio
# Creating WebSocket server
async def ws_server(websocket):
print("WebSocket: Server Started.")
try:
while True:
# Receiving values from client
name = await websocket.recv()
age = await websocket.recv()
# Prompt message when any of the field is missing
if name == "" or age == "":
print("Error Receiving Value from Client.")
break
# Printing details received by client
print("Details Received from Client:")
print(f"Name: {name}")
print(f"Age: {age}")
# Sending a response back to the client
if int(age) < 18:
await websocket.send(f"Sorry! {name}, You can't join the club.")
else:
await websocket.send(f"Welcome aboard, {name}.")
except websockets.ConnectionClosedError:
print("Internal Server Error.")
async def main():
async with websockets.serve(ws_server, "localhost", 7890):
await asyncio.Future() # run forever
if __name__ == "__main__":
asyncio.run(main())
上面的代码导入了用于创建 WebSocket 服务器并与之通信的库,以及用于利用异步任务的 asyncio 库。websockets
然后,该代码定义一个名为的异步函数,该函数将 WebSocket 连接 () 作为其参数。ws_server()websocket
在函数内部,使用一个块来处理来自客户端的传入消息。在块中,会创建一个循环,这意味着代码将连续运行。trytrywhile
在循环中,代码使用 从客户端接收两个值,并将它们分别存储在 和 变量中。该代码检查是否缺少任何值,如果缺少,则提示消息并中断循环,否则它继续并打印从客户端接收的值。websocket.recv()nameage
然后,代码根据获取的值将相应的响应发送回客户端。
在块中,代码处理指示连接期间发生错误的任何异常。exceptwebsockets.ConnectionClosedError
然后,该代码定义另一个异步函数,称为启动 WebSocket 服务器。WebSocket 服务器是使用侦听 和 port 的方法创建的。main()websockets.serve()localhost7890
由于 ,服务器将永远运行。这将使服务器保持活动状态并持续运行以侦听传入的消息。asyncio.Future()
最后,该函数使用 .main()asyncio.run(main())
创建 WebSocket 客户端
在本部分中,你将创建一个客户端,该客户端从用户那里获取输入并显示 WebSocket 服务器发送的响应。
import websockets
import asyncio
# The main function that will handle connection and communication
# with the server
async def ws_client():
print("WebSocket: Client Connected.")
url = "ws://127.0.0.1:7890"
# Connect to the server
async with websockets.connect(url) as ws:
name = input("Your Name (type 'exit' to quit): ")
if name == 'exit':
exit()
age = input("Your Age: ")
# Send values to the server
await ws.send(f"{name}")
await ws.send(f"{age}")
# Stay alive forever, listen to incoming msgs
while True:
msg = await ws.recv()
print(msg)
# Start the connection
asyncio.run(ws_client())
上面的代码定义了一个名为 的异步函数。在函数内部,WebSocket 客户端使用与上一节中创建的服务器的 URL () 一起传递的方法连接到 WebSocket 服务器。ws_client()websockets.connect()ws://127.0.0.1:789
系统会提示用户输入名称,如果用户键入“exit”,则代码将退出该进程。然后要求用户输入他们的年龄,并使用该方法将两个值 ( 和 ) 发送到 WebSocket 服务器。nameagews.send()
之后,代码进入无限循环,使用该方法连续侦听来自服务器的传入消息。然后,该消息将打印在控制台上。ws.recv()
最后,使用 .这将启动 WebSocket 客户端以接受来自用户的信息并显示服务器发送的响应。ws_client()asyncio.run(ws_client())
运行 WebSocket 服务器和客户端
需要将服务器和客户端代码放在两个单独的 Python 文件中。首先,需要运行 WebSocket 服务器脚本来启动服务器。
打开终端窗口,导航到项目目录,然后运行脚本文件,在本例中,脚本存储在 Python 文件中。main.py
现在打开另一个终端窗口并运行 WebSocket 客户端脚本,在本例中,脚本存储在文件中。client.py
python client.py |
这将启动连接到服务器的 WebSocket 客户端。将看到询问您的姓名和年龄的提示。
在这
里,并被发送到服务器,作为回报,服务器在控制台上响应消息。"Sachin""22""Welcome aboard, Sachin"
用户输入的信息将显示在 WebSocket 服务器控制台上。可以在下图中看到这一点。
还可以使用以下命令使用 websockets 交互
式 shell 运行客户端。
python -m websockets ws://localhost:7890 |