UWebSockets.js এবং ওয়েবসাইটসকেট-শার্পের সাথে ওয়েবসকেট সংক্ষেপণ ব্যবহার করা


11

সংযোগের জন্য ওয়েবসকেট ব্যবহার করে আমাদের একটি মোবাইল গেম রয়েছে। সার্ভারটি হ'ল নোড.জেএস অ্যাপ্লিকেশন যা ইউউইবসকেটস.জেএস লাইব্রেরি ব্যবহার করে এবং ক্লায়েন্টটি ওয়েবসকেট -শার্প লাইব্রেরি ব্যবহার করে একটি ইউনিটির অ্যাপ । তারা উভয়ই একসাথে ভাল খেলে এবং আমরা তাদের সাথে কোনও সমস্যার মুখোমুখি হই নি।

সম্প্রতি আমরা ওয়েবসকেট সংক্ষেপণ সক্ষম করতে চেয়েছিলাম । উভয় গ্রন্থাগারই জানিয়েছে যে তারা প্রতি বার্তা সংক্ষেপণ এক্সটেনশানটিকে সমর্থন করে তবে মনে হয় তাদের সাথে কিছুটা বেমানান। কারণ যখন আমরা কম্প্রেশন ব্যবহার করার জন্য কনফিগার করি তখন হ্যান্ডশেকের সাথে সাথে ওয়েবসকেট সংযোগটি বন্ধ হয়ে যায়।

আমরা ডাব্লুএস লাইব্রেরি সহ ক্লায়েন্টও পরীক্ষা করেছি এবং এটি একই ফলাফলের সাথে সংকোচনের উদাহরণ সরবরাহ করেছে। আমরা ডাব্লুএস সংক্ষেপণের বিকল্পগুলির সাথে টিঙ্কারিংয়ের চেষ্টা করেছি এবং দেখেছি যে যখন আমরা সার্ভারম্যাক্স উইন্ডোবিটস বিকল্পটি (আলোচিত মানের ডিফল্ট) মন্তব্য করি তখন সংযোগটি প্রতিষ্ঠিত হতে পারে এবং বার্তা প্রেরণ ও গ্রহণ করা কোনও সমস্যা ছাড়াই কাজ করে। আমরা ইউউবসকেটে সার্ভারম্যাক্স উইন্ডোবিটস নিয়ন্ত্রণ করার বিষয়েও জিজ্ঞাসা করেছি।

সর্বশেষ জিনিসটি আমরা চেষ্টা করেছিলাম একটি ন্যূনতম ইউডাব্লুএস সার্ভার এবং ওয়েবসকেট-ধারালো ক্লায়েন্টকে সংযুক্ত করা। সার্ভারের কোডটি এখানে:

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);
      }
    }
  }
}

যখন আমরা সার্ভার এবং ক্লায়েন্টটি চালাই, ক্লায়েন্টটি নিম্নলিখিত ত্রুটিটি প্রকাশ করে:

ত্রুটি | WebSket.checkHandshakeResponse | সার্ভারটি 'server_no_context_takeover' ফেরত পাঠায় নি। মারাত্মক | ওয়েবসকেট.ডোহ্যান্ডশেক | একটি অবৈধ সেক-ওয়েবস্কট-এক্সটেনশানস শিরোনামকে অন্তর্ভুক্ত করে।

দেখে মনে হয়েছিল ক্লায়েন্টটি সার্ভার_নি_ কনটেক্সট_টেকওভার শিরোনাম করেছে এবং একটিও পায় নি। আমরা uWebsocket উত্স (uWebsockets.js মডিউলের C ++ অংশ) পর্যালোচনা করেছি এবং সার্ভার_ন_কন্টেক্সট_টেকওভার শিরোনামটি ফেরত পাঠানোর জন্য একটি মন্তব্য শর্ত পেয়েছি । সুতরাং আমরা শর্তটি uncommented করে এবং ক্লায়েন্টে নিম্নলিখিত ত্রুটি মোকাবেলার জন্য আবার পরীক্ষা করেছি:

ওয়েবসকেটশর্প. ওয়েবসকেট এক্সেপশন: কোনও ফ্রেমের শিরোনাম স্ট্রিম থেকে পড়া যায় না।

এই দুটি গ্রন্থাগার এক সাথে কাজ করার জন্য কোনও পরামর্শ?


নিশ্চিত নয় যে এটি আদৌ সহায়তা করে তবে সকেট.ইও ডিফল্টভাবে সংকোচন করে। আমি জানি সেরা এইচটিটিপি 2 এর সকেট.ইও - ওয়েবসকেটগুলির জন্য বেশ ভাল সমর্থন রয়েছে।
স্যামুয়েল জি

@ সামুয়েলজি ধন্যবাদ, তবে সকেট.ইও ব্যবহার করা কোনও বিকল্প নয় কারণ আমরা বর্তমানে ন্যূনতম সংস্থানগুলি সহ 5 কে + সমবর্তী সংযোগগুলি পরিচালনা করছি।
কুরোশ পাশোখি

@ কুরোশপাশখি আপনার যুক্তিটি কীভাবে সমাপ্ত করলেন যে সকেট.ইও আপনার বোঝা সামলাতে পারবে না বা সংস্থান নিবিড়? আপনার পরীক্ষা সম্পর্কে আরও শুনতে পছন্দ করবে।
স্যামুয়েল জি

@ সামুয়েলজি মন্তব্যগুলি আলোচনার জন্য নয়, তবে আসুন আমরা বলি যে মূল কারণগুলি সকেটটির ফোকাস io
কুরোশ পাশোখি

উত্তর:


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.js এ সরাসরি কোনও পরীক্ষা লেখার চেষ্টা করুন যা WebSocket.csহেডার প্রত্যাখ্যানের আচরণকে পুনরুত্পাদন করে ? DEDICATED_COMPRESSORসত্যিই কাজ করা উচিত!
ডক্টরপ্যাংলস

আপনি কোন পরীক্ষা বলতে চান? UWebSockets.js এর আর্কিটেকচারটি কিছুটা জটিল। এটিতে জেএস, সি ++ এবং সিতে তিনটি স্তর লেখা রয়েছে, যা ডিবাগিংকে শক্ত করে।
কুরোশ পাশোখি

আমার অর্থ হ'ল uWebSockets.js প্রকল্প ডিরেক্টরিতে একটি পরীক্ষার অনুমোদন যা হ্যান্ডশেক ওয়েবসকেট-শার্পের পুনরুত্পাদন করে, যা আপনি এটি কোনও কমপ্লায়েন্ট সার্ভারের সাথে সংযুক্ত করে এবং কী ঘটতে দেখে আবিষ্কার করতে পারেন?
ডক্টরপ্যাংলুস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.