हमारे पास कनेक्शन के लिए वेबसोकेट का उपयोग करके एक मोबाइल गेम है। सर्वर 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: किसी फ्रेम के हेडर को स्ट्रीम से नहीं पढ़ा जा सकता है।
इन दोनों पुस्तकालयों को एक साथ बनाने के लिए कोई सुझाव?