UWebSockets.js और वेबसोकेट-तीव्र के साथ वेबसोकेट संपीड़न का उपयोग करना


11

हमारे पास कनेक्शन के लिए वेबसोकेट का उपयोग करके एक मोबाइल गेम है। सर्वर uWebSockets.js लाइब्रेरी का उपयोग करके एक Node.js ऐप है और क्लाइंट Websocket-Sharp लाइब्रेरी का उपयोग करके एक यूनिटी ऐप है । वे दोनों साथ खेलते हैं और हमें उनके साथ कोई समस्या नहीं हुई।

हाल ही में हम वेबसोकेट कम्प्रेशन को सक्षम करना चाहते थे । दोनों पुस्तकालयों ने कहा कि वे प्रति-संदेश संपीड़न विस्तार का समर्थन करते हैं लेकिन ऐसा लगता है कि उनके साथ कुछ असंगत है। क्योंकि जब हम संपीड़न का उपयोग करने के लिए कॉन्फ़िगर करते हैं तो वेबस्कैट कनेक्शन हैंडशेक पर तुरंत बंद हो जाता है।

हमने ws लाइब्रेरी के साथ क्लाइंट का भी परीक्षण किया और यह उसी परिणाम के साथ संपीड़न के लिए उदाहरण प्रदान करता है। हमने ws कम्प्रेशन विकल्प के साथ छेड़छाड़ करने की कोशिश की और पाया कि जब हम serverMaxWindowBits विकल्प पर टिप्पणी करते हैं (बातचीत मूल्य के लिए चूक) कनेक्शन स्थापित किया जा सकता है और संदेश भेजना और प्राप्त करना समस्या के बिना काम करता है। हमने uWebsockets में serverMaxWindowBits को नियंत्रित करने के बारे में भी पूछा

हमने जो आखिरी चीज़ की कोशिश की, वह एक न्यूनतम यूडब्ल्यूएस सर्वर और वेबसोकेट-शार्प क्लाइंट को जोड़ने की थी। यहाँ सर्वर के लिए कोड है:

const uWS = require('uWebSockets.js');
const port = 5001;

const app = uWS.App({
    }).ws('/*', {
        /* Options */
        compression: 1, // Setting shared compression method
        maxPayloadLength: 4 * 1024,
        idleTimeout: 1000,
        /* Handlers */
        open: (ws, req) => {
            console.log('A WebSocket connected via URL: ' + req.getUrl() + '!');
        },
        message: (ws, message, isBinary) => {
            /* echo every message received */
            let ok = ws.send(message, isBinary);
        },
        drain: (ws) => {
            console.log('WebSocket backpressure: ' + ws.getBufferedAmount());
        },
        close: (ws, code, message) => {
            console.log('WebSocket closed');
        }
    }).any('/*', (res, req) => {
        res.end('Nothing to see here!');
    }).listen(port, (token) => {
        if (token) {
            console.log('Listening to port ' + port);
        } else {
            console.log('Failed to listen to port ' + port);
        }
    });

यहाँ ग्राहक कोड है:

using System;
using WebSocketSharp;

namespace Example
{
  public class Program
  {
    public static void Main (string[] args)
    {
      using (var ws = new WebSocket ("ws://localhost:5001")) {
        ws.OnMessage += (sender, e) =>
            Console.WriteLine ("server says: " + e.Data);

        ws.Compression = CompressionMethod.Deflate; // Turning on compression
        ws.Connect ();

        ws.Send ("{\"comm\":\"example\"}");
        Console.ReadKey (true);
      }
    }
  }
}

जब हमने सर्वर और क्लाइंट को चलाया, तो क्लाइंट निम्नलिखित त्रुटि का उत्सर्जन करता है:

त्रुटि | WebSocket.checkHandshakeResponse | सर्वर ने 'server_no_context_toverover' वापस नहीं भेजा है। घातक | WebSocket.doHandshake | इसमें एक अमान्य Sec-WebSocket- एक्सटेंशन हेडर शामिल है।

ऐसा लग रहा था कि क्लाइंट को server_no_context_takeover हेडर की उम्मीद थी और उसे प्राप्त नहीं हुआ। हमने uWebsockets स्रोत (C ++ का हिस्सा uWebsockets.js मॉड्यूल) की समीक्षा की और सर्वर_no_context_takeover हेडर वापस भेजने के लिए एक टिप्पणी की स्थिति पाई । इसलिए हमने इस स्थिति को अनकंफर्ट किया और uWebsockets.js का निर्माण किया और ग्राहक में निम्नलिखित त्रुटि का सामना करने के लिए फिर से परीक्षण किया:

WebSocketSharp.WebSocketException: किसी फ्रेम के हेडर को स्ट्रीम से नहीं पढ़ा जा सकता है।

इन दोनों पुस्तकालयों को एक साथ बनाने के लिए कोई सुझाव?


सुनिश्चित नहीं है कि यह बिल्कुल मदद करता है, लेकिन socket.io डिफ़ॉल्ट रूप से संपीड़ित करता है। मुझे पता है कि बेस्ट HTTP 2 में सॉकेट के लिए बहुत अच्छा समर्थन है।
शमूएल जी

@SamuelG धन्यवाद, लेकिन सॉकेट का उपयोग करना। यह एक विकल्प नहीं है क्योंकि हम वर्तमान में न्यूनतम संसाधनों के साथ 5k + समवर्ती कनेक्शन संभाल रहे हैं।
कोशोश पसोखी

@KooroshPasokhi ने आपके तर्क का निष्कर्ष निकाला कि सॉकेट.io आपके भार को संभालने में सक्षम नहीं होगा या संसाधन गहन है? अपने परीक्षणों के बारे में अधिक सुनना पसंद करेंगे।
सैमुअल जी

@SamuelG टिप्पणियाँ चर्चा के लिए नहीं हैं, लेकिन मान लीजिए कि मुख्य कारण सॉकेट का ध्यान केंद्रित करते हैं। यह प्रदर्शन नहीं है और हमें सॉकेट में उच्च स्तर के सार की आवश्यकता नहीं है।
कुरोश पसोखी

जवाबों:


3

अद्यतन: कोड के मेरे पढ़ने के आधार पर uWebSockets.js, websocket-sharpसंपीड़न को सक्षम करने के लिए निर्धारित सभी मापदंडों को सक्षम करने के लिए परिवर्तनों की आवश्यकता होगी । वर्क्सक्स, एक उच्च-प्रदर्शन जावा सर्वर में, निम्नलिखित सेटिंग्स websocket-sharpसंपीड़न के लिए एकता-संगत के साथ काम करती हैं :

vertx.createHttpServer(new HttpServerOptions()
                .setMaxWebsocketFrameSize(65536)
                .setWebsocketAllowServerNoContext(true)
                .setWebsocketPreferredClientNoContext(true)
                .setMaxWebsocketMessageSize(100 * 65536)
                .setPerFrameWebsocketCompressionSupported(true)
                .setPerMessageWebsocketCompressionSupported(true)
                .setCompressionSupported(true));

पहले:

त्रुटि वास्तविक है, इसके बजाय websocket-sharpकेवल समर्थन permessage-deflate, उपयोग DEDICATED_COMPRESSOR( compression: 2) करते हैं।


दुर्भाग्य से कम्प्रेशन मेथड को 2 में सेट करने से एरर मैसेज नहीं बदला गया :(
कोरोश पसोखी

फिर uWebSockets के साथ कुछ अंतर्निहित समस्या है। मैं क्लाइंट में WebSocketSharp के साथ कम्प्रेशन के साथ Java के वर्टेक्स वेबसोकेट का उपयोग करता हूं, जिसमें अधिक कॉन्फ़िगरेशन फ़ील्ड हैं, और यह बस काम करता है।
डॉक्टरपैंगलॉस

शायद सीधे uWebSockets.js में एक परीक्षण को लिखने की कोशिश करें जो कि WebSocket.csहेडर अस्वीकृति के व्यवहार को पुन: पेश करता है ? DEDICATED_COMPRESSORवास्तव में काम करना चाहिए!
डॉक्टरपैंगलॉस

आपको किस टेस्ट से मतलब है? UWebSockets.js की वास्तुकला थोड़ी जटिल है। जेएस, सी ++ और सी में तीन परतें लिखी गई हैं, जो डीबगिंग को कठिन बनाती हैं।
कुरोश पसोखी

मेरा मतलब है कि uWebSockets.js प्रोजेक्ट डायरेक्टरी में एक परीक्षण को संरेखित करना जो हैंडशेक वेबसोकेट-शार्प करता है, जिसे आप शायद एक कंप्लेंट सर्वर से जोड़कर देखते हैं और देखते हैं कि क्या होता है?
DoctorPangloss
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.