5

我正在使用龙卷风作为服务器。我希望它接收二进制数据。服务器端很简单:

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()

这个服务器只是用来可视化传入的数据,并不太特别。该服务器仅使用标准 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)

性格是¡,一个颠倒的!现在我知道龙卷风可以发送二进制文件,但显然不能接收?我可能犯了一些小错误,但它在哪里?

4

1 回答 1

2

在行

print 'GOT MESSAGE: {}'.format(message)

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

print (u'GOT MESSAGE: {}'.format(message))
#      ^

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

print ('GOT MESSAGE: {}'.format(repr(message)))
#                               ^^^^^       ^
于 2013-10-11T23:28:29.813 回答