2013-09-22 32 views
5

Tôi đang sử dụng lốc xoáy làm máy chủ. Tôi muốn nó nhận dữ liệu nhị phân. Phía máy chủ đơn giản như sau:Tornado websockets hỗ trợ nhị phân

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

Máy chủ này chỉ được sử dụng để trực quan hóa dữ liệu đến, không quá đặc biệt. Máy chủ hoạt động chỉ với ascii tiêu chuẩn, nhưng nó phát nổ khi nó nhận được bất kỳ unicode nào (kiểm tra của tôi cho dữ liệu nhị phân giả). Tôi đã sử dụng trang web http://www.websocket.org/echo.html và chuyển hướng gửi đi để đến ws://172.0.0.1:9500/ là nơi tôi thiết lập máy chủ. Máy chủ sau đó đã nhắc tôi với lỗi rất khó chịu:

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) 

Ký tự là ¡, lộn ngược! Bây giờ tôi biết rằng cơn lốc xoáy có thể send binary, nhưng dường như không nhận được? Tôi có thể làm một số sai lầm nhỏ, nhưng nó ở đâu?

+3

gì xảy ra nếu bạn thay thế câu lệnh in dưới dạng 'print u'GOT MESSAGE: {} '. format (message)'? – falsetru

+0

@falsetru Điều đó đã sửa nó. Thở dài, tôi sẽ đóng máy tính xách tay của tôi và đập đầu liên tục vào bức tường gần nhất. Cảm ơn bạn đã chỉ ra điều đó. – jakebird451

Trả lời

2

Trong dòng

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

bạn tư vấn cho Python để định dạng một chuỗi ký tự thành một chuỗi byte, mà thất bại nếu các chuỗi ký tự chứa các ký tự ASCII. Đơn giản chỉ cần sử dụng một chuỗi ký tự (bắt đầu bằng u bằng Python 2.x) thay vì (ngoặc không bắt buộc):

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

Ngoài ra, nếu bạn muốn kiểm tra ký tự nhị phân, sử dụng repr:

print ('GOT MESSAGE: {}'.format(repr(message))) 
#        ^^^^^  ^
Các vấn đề liên quan