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?
Co się stało, gdyby zastąpisz instrukcję print jako 'print u'GOT MESSAGE: {} '. format (message)'? – falsetru
@falsetru To naprawiło to. Sigh, zamierzam zamknąć laptopa i uderzać głową wielokrotnie o najbliższą ścianę. Dziękuję za wskazanie tego. – jakebird451