支持二进制部分2的龙卷风websockets
我试图通过websockets传递二进制数据,更具体地说是通过websockets传递压缩字符串。 在我当前的设置中,我使用龙卷风作为服务器,并使用websocket客户端传输二进制数据。 二进制数据是通过用zlib
压缩数据形成的。 客户端和服务器都很简单,如下所示。
服务器:
import tornado.websocket
import tornado.httpserver
import tornado.ioloop
import tornado.web
class WebSocketServer(tornado.websocket.WebSocketHandler):
def open(self):
print 'OPEN'
def on_message(self, message):
print 'len = {}'.format(len(message))
print 'GOT MESSAGE: {}'.format(message.decode('zlib'))
def on_close(self):
print 'CLOSE'
app = tornado.web.Application([
(r'/', WebSocketServer)
])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(9500)
tornado.ioloop.IOLoop.instance().start()
客户:
import websocket
host = 'localhost'
port_ws = 9500
ws = websocket.create_connection('ws://{}:{}/'.format(host, port_ws))
message = 'this is my message'.encode('zlib')
print 'Length of message is {}'.format(len(message))
ws.send(message)
客户端不会抛出任何错误,它会打印出消息:消息的Length of message is 24
。 该消息按照zlib标准被编码为str
。 另一端的服务器不显示它收到任何消息,它只是了解客户端已连接,然后断开连接。 有谁知道问题在哪里? 我不确定问题是否存在于龙卷风或websockets库中。 有什么建议么?
编辑:为了回应下面的评论(@plg),我修改了上面的脚本以显示:
服务器:
import tornado.websocket
import tornado.httpserver
import tornado.ioloop
import tornado.web
class WebSocketServer(tornado.websocket.WebSocketHandler):
def open(self):
print 'OPEN'
def on_message(self, message):
print 'len = {}'.format(len(message))
print 'GOT MESSAGE: {}'.format(message)
self.write_message(message.encode('zlib'))
def on_close(self):
print 'CLOSE'
app = tornado.web.Application([
(r'/', WebSocketServer)
])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(9500)
tornado.ioloop.IOLoop.instance().start()
客户:
import websocket
host = 'localhost'
port_ws = 9500
ws = websocket.create_connection('ws://{}:{}/'.format(host, port_ws))
#message = 'this is my message'.encode('zlib')
message = 'this is my message'
print 'Length of message is {}'.format(len(message))
ws.send(message)
assert ws.recv().decode('zlib') == message
该系统工作得很好。 断言不会抛出错误。 解码的消息与发送消息匹配。 所以我猜这两者都有问题:
说实话,我相信第一种选择比龙卷风更可能。 在我看来,我相信龙卷风会提醒我,如果传入的消息没有按照websocket标准正确解码。 还有什么建议?
编辑:谁是错误的更多发展。 我没有使用自己的服务器来回传和连接我的连接,而是将连接转发给ws://echo.websocket.org/
。 我的测试应用程序如下所示:
import websocket
host = 'localhost'
port_ws = 9500
ws = websocket.create_connection('ws://echo.websocket.org/')
message = 'this is my message'
ws.send(message.encode('zlib'))
got = ws.recv().decode('zlib')
print 'GOT: {}'.format(got)
assert got == message
这实际上通过了测试,数据收到很好。 所以我想龙卷风接收数据有问题吗?
在查看websocket
库的源代码后,我发现默认情况下它将数据包格式化为文本。 通过改变这一行:
ws.send('message')
# to:
ws.send('message', opcode=websocket.ABNF.OPCODE_BINARY)
# or better yet:
ws.send_binary('message')
数据包将被发送完好无损。 我认为龙卷风只是忽略了伪造的二进制数据包,因为它们被标记为文本并包含二进制文件。
感谢这个提交龙卷风支持websocket压缩扩展。
链接地址: http://www.djcxy.com/p/74489.html上一篇: Tornado websockets supporting binary part 2
下一篇: Using archivesBaseName in a gradle project has no effect