का समर्थन करने वाले टोरनाडो 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) के जवाब में, मैं स्क्रिप्ट के ऊपर है कि दिखाने के लिए संशोधित:
- गैर इनकोडिंग संदेशों बवंडर क्लाइंट से सर्वर तक भेजने जा सकती है
- तूफान एक इनकोडिंग संदेश
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:
सर्वर के साथ उत्तर दे सकते हैं
ग्राहक:
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
प्रणाली ठीक काम करता है। जोर एक त्रुटि फेंक नहीं है। डीकोडेड संदेश प्रेषण संदेश से मेल खाता है। तो मुझे लगता है कि वहाँ या तो साथ एक समस्या है:
- काफी ईमानदारी से कहूं तो प्राप्त इनकोडिंग संदेशों
ग्राहक
संपादित करें: गलती पर कौन सा विकास है। मेरे अपने सर्वर का उपयोग वापस करने के लिए और मेरे कनेक्शन के चौथे हिस्से के बजाय, मैंने कनेक्शन को 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
यह वास्तव में परीक्षा उत्तीर्ण की, डेटा ठीक प्राप्त किया गया था। तो मुझे लगता है कि डेटा प्राप्त करने के साथ टर्ननाडो में कुछ गड़बड़ है?
क्या आपने यह देखने के लिए दूसरी तरफ ऐसा करने का प्रयास किया कि यह काम करता है या अपवाद फेंकता है? क्लाइंट में और खुले में ws.recv() का उपयोग करना(): self.write_message ('यह मेरा संदेश है .encode (' zlib '))। इसके अलावा, क्या आपने zlib संपीड़न के बिना कोशिश की, फिर भी अगर कुछ ऐसा है जो हम खो रहे हैं। – ThinkChaos
@plg यह दूसरी तरफ काम करता है। मैंने टर्ननाडो को एक मानक एसीआईआई संदेश भेजा, और टर्ननाडो ने एन्कोड किए गए संदेश के साथ जवाब दिया। तो वह दिशा काम करती है। – jakebird451