দ্রষ্টব্য: এটি কীভাবে খুব তুচ্ছ সার্ভার প্রয়োগ করতে হবে তা নির্দিষ্টভাবে ফ্রেমিং বিন্যাস অনুযায়ী ইনকামিং এবং আগত ওয়েবসকেট বার্তাগুলি পরিচালনা করতে পারে সে সম্পর্কে এটি কিছু ব্যাখ্যা এবং সিউডোকোড। এতে হ্যান্ডশেকিং প্রক্রিয়া অন্তর্ভুক্ত নয়। তদুপরি, এই উত্তরটি শিক্ষাগত উদ্দেশ্যে তৈরি করা হয়েছে; এটি একটি পূর্ণ বৈশিষ্ট্যযুক্ত বাস্তবায়ন নয়।
নির্দিষ্টকরণ (আরএফসি 6455)
বার্তা প্রেরণ করা হচ্ছে
(অন্য কথায়, সার্ভার-ব্রাউজার)
আপনি যে ফ্রেমগুলি প্রেরণ করছেন তা ওয়েবস্কট ফ্রেমিং বিন্যাস অনুযায়ী ফর্ম্যাট করা দরকার। বার্তা প্রেরণের জন্য, এই ফর্ম্যাটটি নিম্নরূপ:
- একটি বাইট যা ডেটার ধরণ (এবং কিছু অতিরিক্ত তথ্য যা তুচ্ছ সার্ভারের সুযোগের বাইরে থাকে) ধারণ করে
- একটি বাইট যা দৈর্ঘ্য ধারণ করে
- দুটি বা আটটি বাইট যদি দৈর্ঘ্যটি দ্বিতীয় বাইটের সাথে মানানসই হয় না (দ্বিতীয় বাইটটি এমন একটি কোড যা বলা হয় দৈর্ঘ্যের জন্য কত বাইট ব্যবহৃত হয়)
- আসল (কাঁচা) তথ্য
পাঠ্য ফ্রেমের জন্য প্রথম বাইটটি 1000 0001
(বা 129
) হবে ।
দ্বিতীয় বাইটটির প্রথম বিট সেট করা হয়েছে 0
কারণ আমরা ডেটা এনকোড করছি না (সার্ভার থেকে ক্লায়েন্টে এনকোডিং বাধ্যতামূলক নয়)।
কাঁচা ডেটার দৈর্ঘ্য নির্ধারণ করা প্রয়োজন যাতে দৈর্ঘ্য বাইটগুলি সঠিকভাবে প্রেরণ করা যায়:
- যদি
0 <= length <= 125
, আপনার অতিরিক্ত বাইটের দরকার নেই
- যদি
126 <= length <= 65535
, আপনার দুটি অতিরিক্ত বাইট প্রয়োজন এবং দ্বিতীয় বাইট হয়126
- যদি
length >= 65536
, আপনার আট অতিরিক্ত বাইট প্রয়োজন, এবং দ্বিতীয় বাইট হয়127
দৈর্ঘ্যটি আলাদা বাইটে কাটাতে হবে, যার অর্থ আপনাকে ডানদিকে বিট-শিফট করতে হবে (আট বিটের পরিমাণ সহ) এবং তারপরে কেবলমাত্র শেষ আটটি বিট ধরে রাখা হবে AND 1111 1111
(যা 255
)।
দৈর্ঘ্য বাইট (গুলি) পরে কাঁচা ডেটা আসে।
এটি নিম্নলিখিত সিউডোকোডের দিকে নিয়ে যায়:
bytesFormatted[0] = 129
indexStartRawData = -1 // it doesn't matter what value is
// set here - it will be set now:
if bytesRaw.length <= 125
bytesFormatted[1] = bytesRaw.length
indexStartRawData = 2
else if bytesRaw.length >= 126 and bytesRaw.length <= 65535
bytesFormatted[1] = 126
bytesFormatted[2] = ( bytesRaw.length >> 8 ) AND 255
bytesFormatted[3] = ( bytesRaw.length ) AND 255
indexStartRawData = 4
else
bytesFormatted[1] = 127
bytesFormatted[2] = ( bytesRaw.length >> 56 ) AND 255
bytesFormatted[3] = ( bytesRaw.length >> 48 ) AND 255
bytesFormatted[4] = ( bytesRaw.length >> 40 ) AND 255
bytesFormatted[5] = ( bytesRaw.length >> 32 ) AND 255
bytesFormatted[6] = ( bytesRaw.length >> 24 ) AND 255
bytesFormatted[7] = ( bytesRaw.length >> 16 ) AND 255
bytesFormatted[8] = ( bytesRaw.length >> 8 ) AND 255
bytesFormatted[9] = ( bytesRaw.length ) AND 255
indexStartRawData = 10
// put raw data at the correct index
bytesFormatted.put(bytesRaw, indexStartRawData)
// now send bytesFormatted (e.g. write it to the socket stream)
বার্তা গ্রহণ
(অন্য কথায়, ব্রাউজার-সার্ভার)
আপনি প্রাপ্ত ফ্রেমগুলি নিম্নলিখিত ফর্ম্যাটে রয়েছে:
- এক বাইট যা তথ্যের ধরণ ধারণ করে
- একটি বাইট যা দৈর্ঘ্য ধারণ করে
- দৈর্ঘ্যটি দ্বিতীয় বাইটে ফিট না হলে দুটি বা আটটি অতিরিক্ত বাইট
- চারটি বাইট যা মুখোশ (= ডিকোডিং কী)
- আসল তথ্য
প্রথম বাইটটি সাধারণত কিছু যায় আসে না - আপনি যদি কেবল পাঠ্য প্রেরণ করেন তবে আপনি কেবল পাঠ্যের প্রকারটি ব্যবহার করছেন। এটি ক্ষেত্রে 1000 0001
(বা 129
) হবে ।
দ্বিতীয় বাইট এবং অতিরিক্ত দুটি বা আট বাইটের কিছু পার্সিং দরকার, কারণ আপনার দৈর্ঘ্যের জন্য কতগুলি বাইট ব্যবহার করা উচিত তা জানতে হবে (আসল ডেটা কোথায় শুরু হয় তা আপনার জানা দরকার)। দৈর্ঘ্য নিজেই সাধারণত প্রয়োজন হয় না কারণ আপনার কাছে ইতিমধ্যে ডেটা রয়েছে।
দ্বিতীয় বাইটের প্রথম বিটটি সর্বদা থাকে 1
যার অর্থ ডেটাটি মাস্ক করা হয় (= এনকোডড)। ক্লায়েন্ট থেকে সার্ভারে থাকা বার্তাগুলি সর্বদা মুখোশযুক্ত। আপনাকে সেই প্রথম বিটটি সরিয়ে ফেলতে হবে secondByte AND 0111 1111
। দুটি ক্ষেত্রে রয়েছে যে ফলস্বরূপ বাইটটি দৈর্ঘ্যের প্রতিনিধিত্ব করে না কারণ এটি দ্বিতীয় বাইটে ফিট করে না:
- একটি দ্বিতীয় বাইট
0111 1110
, অথবা 126
, নিম্নলিখিত দুটি বাইট দৈর্ঘ্য জন্য ব্যবহার করা হয় এর মানে হল
0111 1111
বা এর দ্বিতীয় বাইট 127
মানে নীচের আটটি বাইট দৈর্ঘ্যের জন্য ব্যবহৃত হয়
চারটি মাস্ক বাইট প্রেরণ করা প্রকৃত ডেটা ডিকোডিংয়ের জন্য ব্যবহৃত হয়। ডিকোডিংয়ের জন্য অ্যালগরিদমটি নিম্নরূপ:
decodedByte = encodedByte XOR masks[encodedByteIndex MOD 4]
যেখানে encodedByte
ডেটাতে মূল বাইট হয়, encodedByteIndex
তা হল আসল তথ্যগুলির প্রথম বাইট থেকে বন্টন গণনার সূচক (অফসেট) , যা সূচকযুক্ত 0
। masks
চারটি মাস্ক বাইট সমন্বিত একটি অ্যারে।
এটি ডিকোডিংয়ের জন্য নিম্নলিখিত সিউডোকোডের দিকে নিয়ে যায়:
secondByte = bytes[1]
length = secondByte AND 127 // may not be the actual length in the two special cases
indexFirstMask = 2 // if not a special case
if length == 126 // if a special case, change indexFirstMask
indexFirstMask = 4
else if length == 127 // ditto
indexFirstMask = 10
masks = bytes.slice(indexFirstMask, 4) // four bytes starting from indexFirstMask
indexFirstDataByte = indexFirstMask + 4 // four bytes further
decoded = new array
decoded.length = bytes.length - indexFirstDataByte // length of real data
for i = indexFirstDataByte, j = 0; i < bytes.length; i++, j++
decoded[j] = bytes[i] XOR masks[j MOD 4]
// now use "decoded" to interpret the received data
1000 0001
একটি পাঠ্য ফ্রেমের জন্য কেন (129)? বৈশিষ্ট বলেছেন বলে:%x1 denotes a text frame
। সুতরাং এটি0000 0001
(0x01
), বা হওয়া উচিত ?