2013-09-22 7 views
7

का समर्थन करने वाले टोरनाडो websockets मैं websockets पर बाइनरी डेटा पास करने का प्रयास कर रहा हूं, वेबसाइकिलों पर अधिक विशेष रूप से संकुचित तार। मेरे वर्तमान सेटअप में मैं टर्ननाडो को websocket क्लाइंट के साथ बाइनरी डेटा ट्रांसमिट करने वाले सर्वर के रूप में उपयोग करता हूं। zlib के साथ डेटा को संपीड़ित करके बाइनरी डेटा बनाया गया है। क्लाइंट और सर्वर दोनों उतना सरल होते हैं जितना वे प्राप्त करते हैं और नीचे दिखाए जाते हैं।बार्नरी भाग 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.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() 

ग्राहक:

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) 

ग्राहक किसी भी त्रुटि फेंक नहीं है, यह पता संदेश यह है कि प्रिंट: Length of message is 24। संदेश को zlib मानक के अनुसार str के रूप में एन्कोड किया गया है। दूसरे छोर पर सर्वर यह नहीं दिखाता है कि इसे कोई संदेश प्राप्त हुआ है, यह सिर्फ समझता है कि एक क्लाइंट कनेक्ट था, और फिर डिस्कनेक्ट हो गया था। क्या किसी को पता है कि समस्या कहां है? मुझे यकीन नहीं है कि समस्या तूफान या websockets पुस्तकालय के भीतर देता है। कोई सुझाव?


संपादित करें: नीचे टिप्पणी (@plg) के जवाब में, मैं स्क्रिप्ट के ऊपर है कि दिखाने के लिए संशोधित:

  1. गैर इनकोडिंग संदेशों बवंडर क्लाइंट से सर्वर तक भेजने जा सकती है
  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. तूफान एक इनकोडिंग संदेश

सर्वर के साथ उत्तर दे सकते हैं

ग्राहक:

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 

प्रणाली ठीक काम करता है। जोर एक त्रुटि फेंक नहीं है। डीकोडेड संदेश प्रेषण संदेश से मेल खाता है। तो मुझे लगता है कि वहाँ या तो साथ एक समस्या है:

  1. काफी ईमानदारी से कहूं तो प्राप्त इनकोडिंग संदेशों

ग्राहक

  • तूफान से एक इनकोडिंग संदेश भेजा जा रहा है, मेरा मानना ​​है कि पहले विकल्प में अधिक है टर्ननाडो से संभव है। मेरी राय में, मेरा मानना ​​है कि टर्ननाडो मुझे सतर्क करेगा अगर किसी आने वाले संदेश को वेबसाकेट मानक के अनुसार ठीक तरह से डीकोड नहीं किया जाता है। कोई और सुझाव?


    संपादित करें: गलती पर कौन सा विकास है। मेरे अपने सर्वर का उपयोग वापस करने के लिए और मेरे कनेक्शन के चौथे हिस्से के बजाय, मैंने कनेक्शन को ws://echo.websocket.org/ पर रिले किया। मेरे परीक्षण आवेदन से पता चलता है के रूप में है:

    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 
    

    यह वास्तव में परीक्षा उत्तीर्ण की, डेटा ठीक प्राप्त किया गया था। तो मुझे लगता है कि डेटा प्राप्त करने के साथ टर्ननाडो में कुछ गड़बड़ है?

  • +1

    क्या आपने यह देखने के लिए दूसरी तरफ ऐसा करने का प्रयास किया कि यह काम करता है या अपवाद फेंकता है? क्लाइंट में और खुले में ws.recv() का उपयोग करना(): self.write_message ('यह मेरा संदेश है .encode (' zlib '))। इसके अलावा, क्या आपने zlib संपीड़न के बिना कोशिश की, फिर भी अगर कुछ ऐसा है जो हम खो रहे हैं। – ThinkChaos

    +0

    @plg यह दूसरी तरफ काम करता है। मैंने टर्ननाडो को एक मानक एसीआईआई संदेश भेजा, और टर्ननाडो ने एन्कोड किए गए संदेश के साथ जवाब दिया। तो वह दिशा काम करती है। – jakebird451

    उत्तर

    3

    websocket लाइब्रेरी के स्रोत कोड को देखने के बाद, मैंने पाया कि डिफ़ॉल्ट रूप से यह पैकेट को टेक्स्ट के रूप में स्वरूपित कर रहा है।लाइन को बदलकर:

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

    पैकेट ठीक से भेजा जाएगा। टोरनाडो मुझे लगता है कि नकली बाइनरी पैकेट को अनदेखा कर रहा था क्योंकि उन्हें टेक्स्ट के रूप में चिह्नित किया गया था और बाइनरी थी।

    0

    इस commit टॉरनेडो वेबसाईट संपीड़न एक्सटेंशन का समर्थन करता है।

    संबंधित मुद्दे