websocket 代码实现

本文档展示了如何使用Python的websockets库实现一个简单的WebSocket服务端和客户端。服务端接收并转发用户消息,同时维护一个连接用户列表。当接收到消息时,会将消息广播给所有其他在线用户。客户端则发送用户输入的名字,并接收服务器的响应。文中提到的困惑点在于WebSocket的ping/pong机制,它们用于心跳检测,确保连接的活跃性。在没有消息交换时,服务器或客户端可以主动发送ping,对方需回应pong以确认连接仍有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

websocket 代码实现

#服务端
import asyncio
import websockets

websocket_users = {}    #将websocket对象保存,方便后续转发数据


async def recv_user_msg(websocket):
    recv_text = await websocket.recv()
    print("recv_text:", websocket.pong, recv_text)
    # for r in range(10):
    #     time.sleep(2)
    #     await websocket.send("*****************************")
    text = recv_text.split(':')
    if text[0] not in websocket_users:
        websocket_users[text[0]] = websocket
        print(websocket_users)
    else:
        response_text = f"{text[0]}: {text[1]}"
        # await websocket_users[text[0]].send(response_text)
        print(websocket_users)
        for i, r in websocket_users.items():
            if i != text[0]:
                await r.send(response_text)


# 服务器端主逻辑
async def run(websocket, path):
    while True:
        try:
            # await check_user_permit(websocket)
            await recv_user_msg(websocket)
        except websockets.ConnectionClosed:
            print("ConnectionClosed...", path)  # 链接断开
            print("websocket_users old:", websocket_users)
            for k in websocket_users.copy():
                if websocket_users[k] == websocket:
                    websocket_users.pop(websocket)
            print("websocket_users new:", websocket_users)
            break
        except websockets.InvalidState:
            print("InvalidState...")  # 无效状态
            break
        except Exception as e:
            print("Exception:", e)


if __name__ == '__main__':
    print("127.0.0.1:8181 websocket...")
    asyncio.get_event_loop().run_until_complete(websockets.serve(run, "127.0.0.1", 8181))
    asyncio.get_event_loop().run_forever()

#客户端
import asyncio
import websockets


async def hello():
    uri = "ws://localhost:8181"
    async with websockets.connect(uri) as websocket:
        name = input("What's your name? ")

        await websocket.send(name)
        print(f"> {name}")

        greeting = await websocket.recv()
        print(f"< {greeting}")


asyncio.get_event_loop().run_until_complete(hello())

困惑点:ping/pong是何时发送的,在停止发消息后主动推送pingpon?

下面是一个简单的Java WebSocket代码实现示例: ```java import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; @ServerEndpoint("/websocket") public class WebSocketServer { @OnOpen public void onOpen(Session session) { System.out.println("WebSocket opened: " + session.getId()); } @OnMessage public void onMessage(String message, Session session) throws IOException { System.out.println("Received message: " + message); // 处理接收到的消息,例如广播给所有连接的客户端 for (Session client : session.getOpenSessions()) { client.getBasicRemote().sendText("Server: " + message); } } @OnClose public void onClose(Session session) { System.out.println("WebSocket closed: " + session.getId()); } @OnError public void onError(Session session, Throwable error) { System.out.println("WebSocket error: " + error.getMessage()); } } ``` 以上代码使用了Java的WebSocket API,通过`@ServerEndpoint`注解定义了一个WebSocket端点,指定了对应的URI路径为`/websocket`。在`@OnOpen`、`@OnMessage`、`@OnClose`和`@OnError`注解的方法中,可以编写相应的逻辑来处理WebSocket的连接、消息、关闭和错误事件。 要在Java应用程序中启动WebSocket服务器,可以使用以下代码: ```java import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer; public class Main { public static void main(String[] args) throws Exception { Server server = new Server(8080); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); server.setHandler(context); WebSocketServerContainerInitializer.configure(context, (servletContext, container) -> { container.addEndpoint(WebSocketServer.class); }); server.start(); server.join(); } } ``` 以上代码使用了Jetty服务器来启动WebSocket服务器,并将WebSocket端点注册到服务器上。 可以通过访问`ws://localhost:8080/websocket`来连接到该WebSocket服务器。你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值