2013-09-22 17 views
7

Web kodları üzerinden web bağlantıları üzerinden, özellikle de sıkıştırılmış dizgiler üzerinden ikili veri geçirmeye çalışıyorum. Şu anki kurulumda, ikili verileri ileten websocket istemcisiyle sunucu olarak kasırga kullanıyorum. İkili veri, verilerin zlib ile sıkıştırılmasıyla oluşturulur. Hem istemci hem de sunucu, aldıkları ve aşağıda gösterildiği gibi basittir.İkili parçayı destekleyen kasırga web yuvaları 2

Sunucu:

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

Müşteri:

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) 

istemci hataları atmak değil, o mesajın basar: Length of message is 24. Mesaj zlib standardına göre str olarak kodlanmıştır. Diğer uçtaki sunucu, herhangi bir mesaj aldığını göstermez, sadece bir istemcinin bağlandığını ve sonra bağlantısının kesildiğini anlar. Sorunun nerede olduğunu bilen var mı? Sorun kasırga veya websockets kütüphanesi içinde yatıyor mu emin değilim. Baska öneri?


DÜZENLEME: Aşağıdaki açıklama (@plg) yanıt olarak, bunu göstermek için yukarıdaki komut dosyalarını modifiye:

  1. Olmayan kodlanmış mesajlar tornado istemciden sunucuya göndermek olabilir
  2. 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() 
    
    012:
  3. Tornado kodlanmış mesajın

Sunucu yanıtlayabilir

Müşteri:

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 

sistem gayet güzel çalışıyor. Assert bir hata atmaz. Şifrelenmiş mesaj, gönderme mesajıyla eşleşir. Bu yüzden bir sorun ya orada olduğunu tahmin:

  1. oldukça dürüst olmak gerekirse istemci
  2. Tornado almayı kodlanmış mesajlar

kodlanmış bir mesaj gönderme, ilk seçenek daha olduğunu inanıyorum Kasırgadan daha muhtemeldir. Benim düşünceme göre, gelen bir mesajın websocket standardına göre uygun şekilde çözülmemesi durumunda kasırganın beni uyarması gerektiğine inanıyorum. Daha fazla öneriniz var mı?


DÜZENLEME: Kimlerin hatalı olduğu konusunda daha fazla gelişme. Bağlantımı geri ve dördüncü bağlantı için kendi sunucumu kullanmak yerine, bağlantıyı ws://echo.websocket.org/'a ilettim. Benim test uygulamam şov olarak gösterildi:

Bu gerçekten testten geçti, veriler gayet iyi karşılandı. Yani veriyi alan kasırgada bir sorun var galiba?

+1

Bir istisna mı çalışıyor, yoksa işe yarayıp yaramadığını görmek için başka bir yöntem mi denediniz? İstemcide ws.recv() öğesini ve open() öğesini kullanarak: self.write_message ('bu benim mesaj'ım.encode (' zlib ')). Ayrıca, zlib sıkıştırması olmadan denediniz mi, yine de eksik olduğumuz bir şey varsa. – ThinkChaos

+0

@plg Diğer şekilde çalışır. Kasırgaya standart bir ascii mesajı gönderdim ve kasırga, kodlanmış mesajla cevap verdi. Yani bu yön çalışır. – jakebird451

cevap

3

websocket kitaplığının kaynak kodunu baktıktan sonra, varsayılan olarak paketleri metin olarak biçimlendirdiğini buldum.Satır değiştirilerek, paket gönderilecektir. Tornado, sanki metin olarak işaretlendiğinden ve ikili olarak yer aldığından, sahte ikili paketleri görmezden geliyordu.

0

Bu commit tornado sayesinde websocket sıkıştırma uzantılarını destekler.