支持二进制的龙卷风websockets

jak*_*451 5 python tornado

我使用龙卷风作为服务器.我希望它能接收二进制数据.服务器端就像简单的获取一样简单:

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 'GOT MESSAGE: {}'.format(message)

    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()
Run Code Online (Sandbox Code Playgroud)

此服务器仅用于可视化传入数据,不是太特别.服务器只能使用标准的ascii查找,但是当它获得任何unicode(我对伪二进制数据的测试)时会爆炸.我使用网站http://www.websocket.org/echo.html并重定向发送到ws://172.0.0.1:9500/我设置服务器的位置.服务器然后提示我非常讨厌的错误:

ERROR:tornado.application:Uncaught exception in /
Traceback (most recent call last):
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site packages/tornado/websocket.py", line 303, in wrapper
    return callback(*args, **kwargs)
  File "test.py", line 11, in on_message
    print 'GOT MESSAGE: {}'.format(message)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

这个角色是¡颠倒的!现在我知道龙卷风可以发送二进制文件,但显然没有收到?我可能做了一些小错误,但它在哪里?

phi*_*hag 2

在行

print 'GOT MESSAGE: {}'.format(message)
Run Code Online (Sandbox Code Playgroud)

您建议Python将字符串格式化为字节字符串,如果字符串包含非ASCII字符,则失败。只需使用字符串(u在 Python 2.x 中以 前缀)代替(括号可选):

print (u'GOT MESSAGE: {}'.format(message))
#      ^
Run Code Online (Sandbox Code Playgroud)

或者,如果您想检查二进制字符,请使用repr

print ('GOT MESSAGE: {}'.format(repr(message)))
#                               ^^^^^       ^
Run Code Online (Sandbox Code Playgroud)