2013-09-22 36 views
7

Tôi đang cố gắng chuyển dữ liệu nhị phân qua websockets, cụ thể hơn các chuỗi được nén trên websockets. Trong thiết lập hiện tại của tôi, tôi sử dụng lốc xoáy làm máy chủ với máy khách websocket truyền dữ liệu nhị phân. Dữ liệu nhị phân được hình thành bằng cách nén dữ liệu với zlib. Cả khách hàng và máy chủ đều đơn giản như họ nhận được và được hiển thị bên dưới.Tornado websockets hỗ trợ phần nhị phân 2

Server:

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 'len = {}'.format(len(message)) 
     print 'GOT MESSAGE: {}'.format(message.decode('zlib')) 

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

Chủ đầu tư:

import websocket 

host = 'localhost' 
port_ws = 9500 
ws = websocket.create_connection('ws://{}:{}/'.format(host, port_ws)) 
message = 'this is my message'.encode('zlib') 
print 'Length of message is {}'.format(len(message)) 
ws.send(message) 

Các khách hàng không ném bất kỳ lỗi nào, nó in ra rằng thông điệp: Length of message is 24. Thư được mã hóa dưới dạng str theo tiêu chuẩn zlib. Máy chủ ở đầu kia không cho thấy rằng nó nhận được bất kỳ tin nhắn nào, nó chỉ hiểu rằng một khách hàng đã kết nối và sau đó ngắt kết nối. Có ai biết vấn đề ở đâu không? Tôi không chắc chắn nếu vấn đề đặt trong cơn lốc xoáy hoặc thư viện websockets. Bất kỳ đề xuất?


EDIT: Đáp lại những nhận xét dưới đây (@plg), tôi sửa đổi kịch bản ở trên để chứng minh rằng:

  1. thông điệp không được mã hóa có thể được gửi từ client đến server cơn lốc xoáy
  2. Tornado có thể trả lời với một thông điệp được mã hóa

server:

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 'len = {}'.format(len(message)) 
     print 'GOT MESSAGE: {}'.format(message) 
     self.write_message(message.encode('zlib')) 

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

Chủ đầu tư: Hệ thống

import websocket 

host = 'localhost' 
port_ws = 9500 
ws = websocket.create_connection('ws://{}:{}/'.format(host, port_ws)) 
#message = 'this is my message'.encode('zlib') 
message = 'this is my message' 
print 'Length of message is {}'.format(len(message)) 
ws.send(message) 
assert ws.recv().decode('zlib') == message 

làm việc tốt. Xác nhận không đưa ra lỗi. Tin nhắn đã giải mã khớp với thông báo gửi. Vì vậy, tôi đoán đó là một vấn đề với một trong hai:

  1. Gửi một tin nhắn được mã hóa từ máy khách
  2. Tornado nhận tin nhắn được mã hóa

Để được khá trung thực, tôi tin rằng sự lựa chọn đầu tiên là hơn có thể xảy ra hơn là lốc xoáy. Theo tôi, tôi tin rằng cơn lốc xoáy sẽ cảnh báo tôi nếu một tin nhắn đến không được giải mã đúng theo tiêu chuẩn websocket. Bạn có thêm đề xuất nào không?


CHỈNH SỬA: Phát triển thêm về người có lỗi. Thay vì sử dụng máy chủ của riêng tôi để chuyển tiếp trở lại và thứ tư kết nối của tôi, tôi đã chuyển tiếp kết nối đến ws://echo.websocket.org/. Đơn đăng ký thử nghiệm của tôi là như hiển thị:

import websocket 

host = 'localhost' 
port_ws = 9500 
ws = websocket.create_connection('ws://echo.websocket.org/') 
message = 'this is my message' 
ws.send(message.encode('zlib')) 
got = ws.recv().decode('zlib') 
print 'GOT: {}'.format(got) 
assert got == message 

Điều này thực sự đã vượt qua kiểm tra, dữ liệu đã được nhận tốt. Vì vậy, tôi đoán có gì đó sai với cơn lốc xoáy nhận dữ liệu?

+1

Bạn đã thử làm theo cách khác để xem liệu nó có hoạt động hay ném ngoại lệ không? Sử dụng ws.recv() trong máy khách và trong open(): self.write_message ('đây là message'.encode của tôi (' zlib ')). Ngoài ra, bạn đã thử mà không có nén zlib, một lần nữa chỉ trong trường hợp có một cái gì đó chúng ta đang thiếu. – ThinkChaos

+0

@plg Nó hoạt động theo cách khác. Tôi đã gửi một tin nhắn ascii tiêu chuẩn đến lốc xoáy, và cơn lốc xoáy trả lời với thông điệp được mã hóa. Vì vậy, hướng đó hoạt động. – jakebird451

Trả lời

3

Sau khi tìm kiếm mặc dù mã nguồn của thư viện websocket, tôi nhận thấy rằng theo mặc định, nó định dạng các gói dưới dạng văn bản.Bằng cách thay đổi dòng:

ws.send('message') 
# to: 
ws.send('message', opcode=websocket.ABNF.OPCODE_BINARY) 
# or better yet: 
ws.send_binary('message') 

Gói này sẽ được gửi qua tốt. Tornado tôi đoán là chỉ bỏ qua các gói nhị phân giả vì chúng được đánh dấu là văn bản và chứa nhị phân.

0

Nhờ cơn lốc xoáy commit này hỗ trợ phần mở rộng nén websocket.

Các vấn đề liên quan