(यह भी देखें: How can I send and receive WebSocket messages on the server side?)
यह काफी आसान है, लेकिन यह प्रारूप को समझने के लिए महत्वपूर्ण है।
पहले बाइट, 1000 0001
, जहां 1
का अर्थ है "अंतिम फ्रेम" लगभग हमेशा तीन 0
किसी भी अर्थ के बिना बिट्स आरक्षित हैं और अब तक 0001
मतलब है कि यह एक पाठ फ्रेम (क्रोम ws.send()
विधि के साथ भेजता है जो है)।
(अद्यतन:।। Chrome अब भी एक ArrayBuffer
के साथ द्विआधारी फ्रेम भेज सकते हैं ताकि आप पाठ और बाइनरी डेटा के बीच अंतर आ सकता है पहला बाइट के अंतिम चार बिट्स, 0002
हो जाएगा डेटा की डिकोडिंग वास्तव में काम करता है वैसे ही।)
दूसरे बाइट में 1
(जिसका अर्थ है कि यह "मुखौटा" (एन्कोडेड) है) के बाद फ्रेम आकार का प्रतिनिधित्व करने वाले सात बिट्स हैं। यदि यह 000 0000
और 111 1101
के बीच है, तो यह आकार है। यदि यह 111 1110
है, तो निम्न 2 बाइट लंबाई हैं (क्योंकि यह सात बिट्स में फिट नहीं होगा), और यदि यह 111 1111
है, तो निम्न 8 बाइट लंबाई हैं (यदि यह दो बाइट्स में फिट नहीं होगा)।
निम्नलिखित चार बाइट्स हैं जो "मास्क" हैं जिन्हें आपको फ्रेम डेटा को डीकोड करने की आवश्यकता है। यह xor एन्कोडिंग का उपयोग करके किया जाता है जो डेटा के indexOfByteInData mod 4
द्वारा परिभाषित मास्क में से एक का उपयोग करता है। डिकोडिंग बस encodedByte xor maskByte
(जहां maskByte
indexOfByteInData mod 4
है) की तरह काम करता है।
अब मैं कहना होगा मैं के साथ सी # बिल्कुल अनुभव नहीं कर रहा हूँ, लेकिन यह कुछ स्यूडोकोड (कुछ जावास्क्रिप्ट लहजे मुझे डर लग रहा है):
var length_code = bytes[1] & 127, // remove the first 1 by doing '& 127'
masks,
data;
if(length_code === 126) {
masks = bytes.slice(4, 8); // 'slice' returns part of the byte array
data = bytes.slice(8); // and accepts 'start' (inclusively)
} else if(length_code === 127) { // and 'end' (exclusively) as arguments
masks = bytes.slice(10, 14); // Passing no 'end' makes 'end' the length
data = bytes.slice(14); // of the array
} else {
masks = bytes.slice(2, 6);
data = bytes.slice(6);
}
// 'map' replaces each element in the array as per a specified function
// (each element will be replaced with what is returned by the function)
// The passed function accepts the value and index of the element as its
// arguments
var decoded = data.map(function(byte, index) { // index === 0 for the first byte
return byte^masks[ index % 4 ]; // of 'data', not of 'bytes'
// xor mod
});
तुम भी the specification जो सहायक हो सकता है डाउनलोड कर सकते हैं (इसमें निश्चित रूप से प्रारूप को समझने के लिए आवश्यक सब कुछ शामिल है)।
स्वीट ... मैं इसे सोमवार को काम पर आज़माउंगा। अगर यह काम करता है तो मैं आपको स्वीकार्य उत्तर दूंगा ... :) – gislikonrad
अंत में मेरे वेबसाइकिल सर्वर के लिए इस समाधान को देखने के लिए मिल गया। एक आकर्षण की तरह काम किया ... धन्यवाद, आदमी ... – gislikonrad
@ गिसली Konráð: महान यह आपके लिए काम किया; WebSockets वास्तव में डीबगिंग-अनुकूल नहीं हैं। – pimvdb