সংযোগের জন্য ওয়েবসকেট ব্যবহার করে আমাদের একটি মোবাইল গেম রয়েছে। সার্ভারটি হ'ল নোড.জেএস অ্যাপ্লিকেশন যা ইউউইবসকেটস.জেএস লাইব্রেরি ব্যবহার করে এবং ক্লায়েন্টটি ওয়েবসকেট -শার্প লাইব্রেরি ব্যবহার করে একটি ইউনিটির অ্যাপ । তারা উভয়ই একসাথে ভাল খেলে এবং আমরা তাদের সাথে কোনও সমস্যার মুখোমুখি হই নি।
সম্প্রতি আমরা ওয়েবসকেট সংক্ষেপণ সক্ষম করতে চেয়েছিলাম । উভয় গ্রন্থাগারই জানিয়েছে যে তারা প্রতি বার্তা সংক্ষেপণ এক্সটেনশানটিকে সমর্থন করে তবে মনে হয় তাদের সাথে কিছুটা বেমানান। কারণ যখন আমরা কম্প্রেশন ব্যবহার করার জন্য কনফিগার করি তখন হ্যান্ডশেকের সাথে সাথে ওয়েবসকেট সংযোগটি বন্ধ হয়ে যায়।
আমরা ডাব্লুএস লাইব্রেরি সহ ক্লায়েন্টও পরীক্ষা করেছি এবং এটি একই ফলাফলের সাথে সংকোচনের উদাহরণ সরবরাহ করেছে। আমরা ডাব্লুএস সংক্ষেপণের বিকল্পগুলির সাথে টিঙ্কারিংয়ের চেষ্টা করেছি এবং দেখেছি যে যখন আমরা সার্ভারম্যাক্স উইন্ডোবিটস বিকল্পটি (আলোচিত মানের ডিফল্ট) মন্তব্য করি তখন সংযোগটি প্রতিষ্ঠিত হতে পারে এবং বার্তা প্রেরণ ও গ্রহণ করা কোনও সমস্যা ছাড়াই কাজ করে। আমরা ইউউবসকেটে সার্ভারম্যাক্স উইন্ডোবিটস নিয়ন্ত্রণ করার বিষয়েও জিজ্ঞাসা করেছি।
সর্বশেষ জিনিসটি আমরা চেষ্টা করেছিলাম একটি ন্যূনতম ইউডাব্লুএস সার্ভার এবং ওয়েবসকেট-ধারালো ক্লায়েন্টকে সংযুক্ত করা। সার্ভারের কোডটি এখানে:
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 করে এবং ক্লায়েন্টে নিম্নলিখিত ত্রুটি মোকাবেলার জন্য আবার পরীক্ষা করেছি:
ওয়েবসকেটশর্প. ওয়েবসকেট এক্সেপশন: কোনও ফ্রেমের শিরোনাম স্ট্রিম থেকে পড়া যায় না।
এই দুটি গ্রন্থাগার এক সাথে কাজ করার জন্য কোনও পরামর্শ?