将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的主要内容,如果未能解决你的问题,请参考以下文章