Python "pywbsocket" HTML5 WebSocket服务器配置问题?

2 投票
2 回答
585 浏览
提问于 2025-04-17 03:53

你好,我正在尝试使用Python的pywebsocket HTML5服务器,我用的是一个示例文件,这个文件会把收到的内容原封不动地返回。

def web_socket_transfer_data(request):
    count = 0
    while (count < 1):
    line = request.ws_stream.receive_message()
    print line
    request.ws_stream.send_message(line)  

这个在一个网页上运行得很好,但如果我用两个客户端(两个网页同时连接到同一个socket服务器,使用相同的端口),脚本的表现还是一样。

我想要实现的是,当socket服务器发送消息时,所有连接的网页都能收到这些消息。可惜的是,这并没有成功。我很困惑,因为两个网页都是通过同一个socket在监听,那为什么它们收不到消息呢?

我需要做什么修改或者有什么解决办法,让socket服务器能够把消息传送或广播给所有连接的客户端吗?

请帮帮我...

2 个回答

0

问题是每次调用的时候,连接的变量都会被重置,我觉得是这样。

所以我把代码改了一下,只有在连接变量还没有定义的时候才去初始化它:

try:
    connections
except: 
    connections = []

现在应该可以正常工作了。

3

除了多播套接字,其他的连接都是一对一的。也就是说,你需要在某个地方维护一个打开的套接字列表,然后把消息发送给每一个连接的客户端。你在创建套接字时连接的端口相同,仅仅意味着每个客户端都连接到了同一个服务。

下面是一个如何将每个连接添加到列表中,并向所有连接广播消息的示例。当然,我强烈建议你写一些代码来处理已经失效或关闭的连接,并把它们从列表中移除。我这里只是想传达一个大概念(尤其是因为我已经有几年没用Python编程了。我这个代码片段是基于pywbsocket的示例代码,所以和你的代码会有些不同。请注意,我也没有考虑线程安全的问题,这也是需要关注的地方)

connections = []

def web_socket_do_extra_handshake(request):
    connections.append(request);
    pass

def web_socket_transfer_data(request):
    while True:
        line = msgutil.receive_message(request)
        for connection in connections[:]:
            msgutil.send_message(connection, line)
        if line == "Bye":
            return

撰写回答