2013-09-22 14 views
5

Używam tornado jako serwera. Chciałbym otrzymać dane binarne. Strona serwera jest tak prosta, jak prosta:Tornado websockets obsługujące binarne

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

Ten serwer jest używany tylko do wizualizacji danych przychodzących, nie jest zbyt specjalny. Serwer działa po prostu przy pomocy standardowego ascii, ale eksploduje, gdy otrzyma dowolny kod Unicode (mój test na fałszywe dane binarne). Użyłem strony http://www.websocket.org/echo.html i przekierowałem wysyłkę, aby przejść do ws://172.0.0.1:9500/, gdzie skonfigurowałem serwer. Następnie serwer skłoniło mnie z bardzo bolesnego błędu:

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) 

Postać była ¡, upside down!. Teraz wiem, że tornado może send binary, ale najwyraźniej nie otrzymasz? Prawdopodobnie popełniam drobny błąd, ale gdzie to jest?

+3

Co się stało, gdyby zastąpisz instrukcję print jako 'print u'GOT MESSAGE: {} '. format (message)'? – falsetru

+0

@falsetru To naprawiło to. Sigh, zamierzam zamknąć laptopa i uderzać głową wielokrotnie o najbliższą ścianę. Dziękuję za wskazanie tego. – jakebird451

Odpowiedz

2

W linii

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

doradzić Python sformatować ciąg znaków w ciąg bajtów, co nie działa, jeśli ciąg znaków zawiera znaki spoza ASCII. Wystarczy użyć ciąg znaków (wraz z przedrostkiem u w Pythonie 2.x) zamiast (nawiasy opcjonalnie):

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

Ewentualnie, jeśli chcesz sprawdzić znaków binarnych, użyj repr:

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