2013-09-22 14 views
5

Sto usando il tornado come server. Mi piacerebbe che ricevesse dati binari. Il lato server è semplice come semplice ottiene:Websocket Tornado che supportano il binario

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

Questo server è solo utilizzato per visualizzare i dati in entrata, non troppo speciali. Il server funziona solo con lo standard ASCII, ma esplode quando ottiene un unicode (il mio test per dati binari falsi). Ho usato il sito http://www.websocket.org/echo.html e reindirizzato l'invio per andare a ws://172.0.0.1:9500/ che è dove ho impostato il server. Il server quindi mi ha spinto con l'errore molto brutto:

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) 

il personaggio era ¡, una a testa in giù!. Ora so che il tornado può send binary, ma a quanto pare non riceve? Probabilmente sto facendo un piccolo errore, ma dov'è?

+3

Cosa succederebbe se si sostituisce la dichiarazione di stampa come 'print u'GOT MESSAGE: {} '. format (message)'? – falsetru

+0

@falsetru che l'ha risolto. Sigh, chiuderò il mio portatile e sbatterò la testa ripetutamente contro il muro più vicino. Grazie per la segnalazione. – jakebird451

risposta

2

Nella linea

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

consigliate Python per formattare una stringa di caratteri in una stringa di byte, che non riesce se la stringa di caratteri contiene caratteri non ASCII. Basta usare una stringa di caratteri (con prefisso u in Python 2.x), invece (parentesi opzionale):

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

In alternativa, se si vuole ispezionare caratteri binari, utilizzare repr:

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