我使用龙卷风作为服务器。我希望它能接收二进制数据。服务器端就像简单的一样简单:
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)
角色是¡
,颠倒了!现在我知道龙卷风可以send binary,但显然没有收到?我可能会犯一些小错误,但它在哪里呢?
答案 0 :(得分:2)
在第
行print 'GOT MESSAGE: {}'.format(message)
建议Python将字符串格式化为字节字符串,如果字符串包含非ASCII字符,则会失败。只需使用字符串(在Python 2.x中以u
为前缀)(括号可选):
print (u'GOT MESSAGE: {}'.format(message))
# ^
或者,如果要检查二进制字符,请使用repr
:
print ('GOT MESSAGE: {}'.format(repr(message)))
# ^^^^^ ^