将python客户端服务器转换为websocket

Posted

技术标签:

【中文标题】将python客户端服务器转换为websocket【英文标题】:Convert python client server to websocket 【发布时间】:2012-02-09 21:29:32 【问题描述】:

我创建了一个简单的回显服务器,我想将它用于一个简单的网络服务器示例。

到现在我已经有了服务器:

服务器.py

from socket import *
import threading
import thread

def handler(clientsock,addr):
    while 1:
        data = clientsock.recv(BUFSIZ)
        if not data:
            break
        msg = 'echoed:... ' + data
        clientsock.send(msg)
     clientsock.close()

if __name__=='__main__':
    HOST = 'localhost'
    PORT = 21567
    BUFSIZ = 1024
    ADDR = (HOST, PORT)
    serversock = socket(AF_INET, SOCK_STREAM)
    serversock.bind(ADDR)
    serversock.listen(2)

    while 1:
        print 'waiting for connection...'
        clientsock, addr = serversock.accept()
        print '...connected from:', addr
        thread.start_new_thread(handler, (clientsock, addr))

我想使用websockify,我发现它能够使用以下方法包装现有程序:

./websockify 2023 -- PROGRAM ARGS

如何使用上述命令运行之前的服务器? 当 server.py 在另一台机器上运行时,我可以在一台机器上运行websockify 吗?如是。如何修改上述命令?

谁能提供一个简单的 html5 示例来告诉我 client.html 应该是什么样子?请记住,我希望能够将示例与不支持本机 websocket 的浏览器一起使用。我认为 websockify 能够使用web-socket-js 做到这一点。

他们声明:It has transparent support for binary data and has automatic fallback to the web-socket-js Flash Websocket shim/polyfill if the browser does not support WebSockets natively

【问题讨论】:

【参考方案1】:

要与 websockify 交互,我建议您的客户端 HTML/javascript 使用 include/websock.js 提供的库。 websock.js API 与标准 WebSocket 有点不同。

我刚刚将一个非常 simple HTML client page 推送到 websockify 存储库中。

要将您的 server.py 包装在同一系统上,您可以像这样运行 websockify:

./websockify --web ./ 21567 -- server.py

在“http://localhost:21567/tests/simple.html”加载简单客户端。输入“ws://localhost:21567”作为 websocket URI 并点击连接。请注意,wrap 模式使用了 rebind。因此您必须构建将侦听端口移开以便 websockify 可以为您进行干预的构建。

您也可以在同一系统上单独运行 websockify:

./server.py
./websockify --web ./ 6080 localhost:21567

在这种情况下,您将浏览到“http://localhost:6080/tests/simple.html”并使用“ws://localhost:6080”作为连接的 URI。

如果您想在与运行 server.py 的机器不同的机器上运行 websockify,那么您需要更改 server.py 以在公共接口上侦听,而不仅仅是“localhost”。进行更改后,如果 server.py 在 192.168.1.7 上运行,那么您可以像这样在 192.168.1.5 上运行 websockify:

在 192.168.1.7 启动 server.py:

./server.py

在 192.168.1.5 上启动 websockify 并将其指向另一个系统上的 server.py:

./websockify --web ./ 6080 192.168.1.7:21567

然后您将浏览到“http://192.168.1.5:6080/tests/simple.html”并使用 URI“ws://192.168.1.5:6080”。

或者,如果您只是希望您的服务器成为 WebSocket 服务器,那么您可以使用 websocket.py 库而不使用完整的 websockify 功能并直接创建您的服务器。请参阅 websockify 中包含的 tests/echo.py 示例,这是一个简单的 WebSocket 回显服务器。

【讨论】:

再次非常感谢您的广泛回答。你能澄清一下吗?如果我在server 1 上运行server.py 和在server 2 上运行websockify,我还需要rebind.so 吗?我不这么认为。 不,你只需要 rebind.so 如果你在包装模式下使用它。另外,我忘了提到,如果您使用 include/websock.js,它将为不支持本机 WebSocket 的浏览器引入 web-socket-js Flash 仿真。 不幸的是,它在 IE9 中不起作用。你能推荐点什么吗? 8: 10.16.5.135: Sending flash policy response 9: 10.16.5.135: Plain non-SSL (ws://) WebSocket connection 9: 10.16.5.135: Version hixie-76, base64: 'True' @salamis,该输出表明连接已打开。你能打开一个 websockify issue 以便我们可以正确跟踪。此外,在此期间来自 javascript 控制台的任何输出都会有所帮助。

以上是关于将python客户端服务器转换为websocket的主要内容,如果未能解决你的问题,请参考以下文章

TCP 套接字到 Websocket?

Python - 单向 websocket

python实现websocket

python--websocket数据解析

将 JavaScript 通过 websockets 发送的最后一个字符剥离到 Python

WebSocket消息推送