如何用 Python 创建 WebSocket 服务器和客户端

你一定见过数据频繁更改或实时更新的实时应用程序,这是因为该应用程序使用 WebSocket 实现了这一功能。

本文结束时,您将了解到:

  • 什么是 WebSocket?
  • 如何使用 Python 创建 WebSocket 服务器和客户端?

什么是 WebSocket?

WebSocket 允许两个实体通过单个 TCP 连接进行双向通信(双向)。这意味着 WebSocket 客户端和服务器可以在单个连接中多次交互。

WebSocket 连接是一种全双工连接协议,这意味着数据可以在两个方向上同时发送和接收,在服务器或客户端决定停止连接之前,连接一直保持有效。

在实时应用中,它可用于双向低延迟数据交换。

如何使用 Python 创建 WebSocket

在本节中,您将使用 Python 的 websockets 库创建服务器和客户端。

1. 安装依赖项

打开终端窗口并运行以下命令:

pip install websockets

使用 websockets 库,可以在 Python 中超级轻松地创建一个 websocket 服务器和客户端。

2. 创建 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 服务器并与之通信的 websockets 库和用于使用异步任务的 asyncio 库。

代码定义了一个名为 ws_server()的异步函数,该函数将 WebSocket 连接(websocket)作为参数。

在该函数内部,使用了一个 try 块来处理客户端传入的信息。在 try 代码块中,创建了一个 while 循环,这意味着代码将持续运行。

在循环中,代码使用 websocket.recv() 从客户端接收两个值,并分别存储在 name age 变量中。代码会检查是否有任何值丢失,如果有,则会提示信息并中断循环,否则会继续运行并打印从客户端接收到的值。

然后,代码会根据获得的值向客户端发送适当的响应。

在异常块中,代码会处理任何表示连接过程中发生错误的 websockets.ConnectionClosedError 异常。

然后,代码定义了另一个名为 main() 的异步函数,用于启动 WebSocket 服务器。WebSocket 服务器使用 websockets.serve() 方法创建,该方法监听 localhost7890 端口。

由于使用了 asyncio.Future(),服务器将永久运行。这将使服务器保持活力并持续运行,以监听传入的消息。

最后,使用 asyncio.run(main()) 运行 main() 函数。

3. 创建 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())

上述代码定义了一个名为 ws_client()的异步函数。在该函数中,WebSocket 客户端使用 websockets.connect() 方法连接到 WebSocket 服务器,同时传递上一节中创建的服务器的 URL(ws://127.0.0.1:789)。

系统会提示用户输入名称,如果输入 “exit”,代码就会退出进程。然后要求用户输入年龄,并使用 ws.send() 方法将两个值(姓名和年龄)发送到 WebSocket 服务器。

之后,代码进入无限循环,使用 ws.recv() 方法持续监听来自服务器的传入信息。然后将消息打印到控制台上。

最后,使用 asyncio.run(ws_client()) 运行 ws_client() 函数。这将启动 WebSocket 客户端接受来自用户的信息,并显示服务器发送的响应。

运行 WebSocket 服务器和客户端

您需要将服务器和客户端代码分别放在两个 Python 文件中。首先,需要运行 WebSocket 服务器脚本来启动服务器。

打开终端窗口,导航到项目目录,然后运行脚本文件,在本例中,脚本保存在 main.py Python 文件中。

python main.py

现在打开另一个终端窗口并运行 WebSocket 客户端脚本,在本例中,脚本存储在client.py文件中。

python client.py

这将启动连接到服务器的 WebSocket 客户端。您将看到提示,询问您的姓名和年龄。

如何用 Python 创建 WebSocket 服务器和客户端

在这里,”Sachin “和 “22 “会被发送到服务器,而服务器则会在控制台上回复 “Welcome aboard, Sachin“(欢迎加入,Sachin)信息。

用户输入的信息将显示在 WebSocket 服务器控制台上。如下图所示:

如何用 Python 创建 WebSocket 服务器和客户端
WebSocket服务器

您也可以使用 websockets 交互式 shell 运行客户端,命令如下:

python -m websockets ws://localhost:7890

结论

在本文中,您学会了使用 Python 中的 websockets 库创建 WebSocket 服务器和客户端。该技术用于数据实时变化的应用程序。

本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/im/36654.html

(0)

相关推荐

发表回复

登录后才能评论