Ù¾Ø±ÙØªÙÚ©Ù ÙØ¨â سÙکت, ÙÙ Ø§ÙØ·Ùر ک٠در RFC 6455 ØªÙØ¶ÛØØ§Øª آ٠ارائ٠شد٠است, راÙÛ Ø±Ø§ Ø¨Ø±Ø§Û Ø±Ø¯ÙØ¨Ø¯Ù Ú©Ø±Ø¯Ù Ø¯ÛØªØ§ بÛÙ Ù Ø±ÙØ±Ú¯Ø± Ù Ø³Ø±ÙØ± ب٠شک٠ÛÚ© ارتباط ٠ست٠ر Ù ÛØ³Ø± Ù ÛØ³Ø§Ø²Ø¯. در اÛÙ Ù¾Ø±ÙØªÙÚ©Ù Ø§Ø·ÙØ§Ø¹Ø§Øª Ù ÛØªÙاÙÙØ¯ بدÙ٠شکست٠ارتباط Ù ÙÛØ§Ø² Ø¨Ù Ø¯Ø±Ø®ÙØ§Ø³Øª HTTP اضاÙÙ Ø¨Ù Ø´Ú©Ù Ø¯ÙØ³ÙÛ٠٠در ÙØ§Ùب âpacketsâ Ø±Ø¯ ٠بد٠شÙÙØ¯.
Ø¨Ù Ø·ÙØ± خاص ÙØ¨ سÙکت Ø¨Ø±Ø§Û Ø³Ø±ÙÛØ³âÙØ§ÛÛ Ú©Ù ÙÛØ§Ø² Ø¨Ù ØªØ¨Ø§Ø¯Ù Ø§Ø·ÙØ§Ø¹Ø§Øª ب٠شک٠٠ست٠ر Ø¯Ø§Ø±ÙØ¯ ٠ث٠بازÛÙØ§Û Ø¢ÙÙØ§ÛÙØ Ø³ÛØ³ØªÙ âÙØ§Û ØªØ±ÛØ¯ ÙØØ¸ÙâØ§Û Ù Ù ÙØ§Ø±Ø¯ Ù Ø´Ø§Ø¨Ù Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâØ´ÙØ¯.
ÛÚ© ٠ثا٠سادÙ
Ø¨Ø±Ø§Û Ø¢ØºØ§Ø² ÛÚ© اتصا٠از ÙÙØ¹ ÙØ¨ سÙÚ©ØªØ Ù
ا ÙÛØ§Ø² Ø¨Ù Ø§ÛØ¬Ø§Ø¯ ÛÚ© ÙØ¨ سÙکت Ø¬Ø¯ÛØ¯ با Ø§Ø³ØªÙØ§Ø¯Ù از Ù¾Ø±ÙØªÙÚ©Ù Ù
Ø®ØµÙØµ ws در url دارÛÙ
:
let socket = new WebSocket("ws://javascript.info");
ÙÙ
ÚÙÛÙ Ù¾Ø±ÙØªÙک٠رÙ
Ø²Ú¯Ø°Ø§Ø±Û Ø´Ø¯Ù //:wss ÙØ¬Ùد دارد. اÛÙ Ù¾Ø±ÙØªÙÚ©Ù ÙÙ
اÙÙØ¯ Ù¾Ø±ÙØªÙÚ©Ù HTTPS Ø¨Ø±Ø§Û ÙØ¨ سÙکت ÙØ§ Ù
ÛØ¨Ø§Ø´Ø¯.
wss:// ÙÙ
ÙØ§Ø±Ù ØªØ±Ø¬ÛØ Ø¨Ø±Ø§Ø³ØªÙØ§Ø¯Ù از Ù¾Ø±ÙØªÙÚ©ÙÙ¾Ø±ÙØªÙÚ©Ùwss:// Ù٠تÙÙØ§ رÙ
Ø²Ú¯Ø°Ø§Ø±Û Ø´Ø¯Ù Ø¨ÙÚ©Ù ÙØ§Ø¨Ù اعتÙ
اد ÙÛØ² ÙØ³Øª
عدÙ
رÙ
Ø²Ú¯Ø°Ø§Ø±Û Ø¯Ø± ارتباط با Ù¾Ø±ÙØªÙÚ©Ù //:ws باعث ÙØ§Ø¨Ù رÙÛØª Ø¨ÙØ¯Ù Ø§Ø·ÙØ§Ø¹Ø§Øª ØªÙØ³Ø· ÙØ± Ø±Ø§Ø¨Ø·Û Ù
ÛØ´Ùد. ÚÙ٠پرÙÚ©Ø³Û Ø³Ø±ÙØ±ÙØ§Û ÙØ¯ÛÙ
Û Ø±Ø§Ø¬Ø¹ Ø¨Ù ÙØ¨ سÙکت ÙØ§ Ø§Ø·ÙØ§Ø¹Û ÙØ¯Ø§Ø±Ùد Ù
Ù
ک٠است ÙØ¯Ø±Ùا را âÙØ§Ø¢Ø´ÙØ§â ØªØ´Ø®Ûص داد٠٠ارتبط را ÙØ·Ø¹ Ú©ÙÙØ¯.
از طر٠دÛÚ¯Ø±Ø Ù¾Ø±ÙØªÙÚ©Ù //:wss بررÙÛ TLS Ø¨ÙØ¯Ù (ÙÙ
Ø§ÙØ·Ùر Ú©Ù HTTPS ÙÙ
ا٠HTTP بررÙÛ TLS Ù
ÛØ¨Ø§Ø´Ø¯.) ÙØ§Û٠اÙ
ÙÛØª Ø§ÙØªÙØ§Ù Ø§Ø·ÙØ§Ø¹Ø§Øª را از سÙ
ت ÙØ±Ø³ØªÙد٠رÙ
Ø²Ú¯Ø°Ø§Ø±Û Ú©Ø±Ø¯Ù Ù Ø¯Ø± سÙ
ت Ú¯ÛØ±Ùد٠رÙ
زگشاÛÛ Ù
ÛÚ©ÙØ¯. Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ Ø§Ø·ÙØ§Ø¹Ø§Øª ب٠شک٠رÙ
Ø²Ú¯Ø°Ø§Ø±Û Ø´Ø¯Ù Ø§Ø² Ù
ÛØ§Ù پرÙکسÛâÙØ§ Ø¹Ø¨ÙØ± Ù
ÛÚ©ÙÙØ¯. Ø¢ÙÙØ§ ÙÙ
ÛØªÙاÙÙØ¯ ببÛÙÙØ¯ ÚÙ ÚÛØ²Û درÙ٠اÛÙ Ø¨Ø³ØªÙ ÙØ§ ÙØ¬Ùد دارد ٠تÙÙØ§ Ø¢ÙÙØ§Ø±Ø§ Ø¹Ø¨ÙØ± Ù
ÛØ¯ÙÙØ¯.
ز٠اÙÛ Ú©Ù Ø³Ùکت Ø§ÛØ¬Ø§Ø¯ Ù ÛØ´ÙØ¯Ø Ù Ø§ Ø¨Ø§ÛØ¯ ب٠رÙÛØ¯Ø§Ø¯ÙØ§Û Ø¢Ù Ú¯ÙØ´ Ú©ÙÛÙ . Ø¯Ø±Ù Ø¬Ù ÙØ¹ 4 ÙÙØ¹ رÙÛØ¯Ø§Ø¯ ÙØ¬Ùد دارد:
openâ Ø§ØºØ§Ø² ارتباط,messageâ Ø¯Ø±ÛØ§ÙØª Ø§Ø·ÙØ§Ø¹Ø§Øª,errorâ Ø®Ø·Ø§Û ÙØ¨ سÙکت,closeâ Ø¨Ø³ØªÙ شد٠ارتباط .
â¦Ù اگر Ø¨Ø®ÙØ§ÙÛÙ
ÚÛØ²Û ارسا٠کÙÛÙ
Ø¢Ùگا٠socket.send(data) اÛ٠کار را Ø§ÙØ¬Ø§Ù
Ø®ÙØ§Ùد داد.
ÛÚ© ٠ثاÙ:
let socket = new WebSocket("wss://javascript.info/article/websocket/demo/hello");
socket.onopen = function(e) {
alert("[open] Connection established");
alert("Sending to server");
socket.send("My name is John");
};
socket.onmessage = function(event) {
alert(`[message] Data received from server: ${event.data}`);
};
socket.onclose = function(event) {
if (event.wasClean) {
alert(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`);
} else {
// Ø¨Ø±Ø§Û Ù
ثا٠عÙ
ÙÛØ§Øª سÙ
ت Ø³Ø±ÙØ± ب٠Ù
Ø´Ú©Ù Ø®ÙØ±Ø¯Ù Ù ÛØ§ شبک٠از کار Ø§ÙØªØ§Ø¯Ù است
// در اÛÙ Ù
ÙÙØ¹Ûت event.code عدد 1006 است.
alert('[close] Connection died');
}
};
socket.onerror = function(error) {
alert(`[error]`);
};
Ø¨Ø±Ø§Û ÙÙ Ø§ÛØ´ ÙØÙ٠ع٠Ùکرد ÙØ¨ سÙÚ©ØªØ Ø³Ø±ÙØ± Ú©ÙÚÚ© server.js ک٠با Node.js ÙÙØ´ØªÙ شد٠است ÙØ¬Ùد دارد. Ø¨Ø±Ø§Û Ù Ø«Ø§Ù Ø¨Ø§ÙØ§ Ø§Ø¬Ø±Ø§Û Ø¢Ù ÛÚ© پاسخ ب٠شک٠âHello from server, Johnâ Ø¨Ø±Ù ÛÚ¯Ø±Ø¯Ø§ÙØ¯ سپس ب٠٠دت 5 ثاÙÛ٠صبر کرد٠٠ارتباط را Ù ÛØ¨Ùدد.
Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ Ø´Ù
ا رÙÛØ¯Ø§Ø¯ÙØ§Û open â message â close را Ø®ÙØ§ÙÛØ¯ Ø¯ÛØ¯
در ÙØ§Ùع Ú©ÙÛØª ٠اجرا ÙÙ ÛÙ Ø§Ø³ØªØ ØØ§Ùا Ù ÛØªÙÙÛ٠با ÙØ¨ سÙکت ارتباط Ø¨Ø±ÙØ±Ø§Ø± Ú©ÙÛÙ . ساد٠است Ù Ú¯Ù ÙÙØ
ØØ§Ùا Ø¨ÛØ§Ûد تا ع٠ÛÙâØªØ± Ø¨Ø±Ø±Ø³Û Ú©ÙÛÙ .
Ø§ÛØ¬Ø§Ø¯ ÛÚ© ÙØ¨ سÙکت
زÙ
اÙÛ Ú©Ù ÛÚ© ÙØ¨ سÙکت با Ø¯Ø³ØªÙØ± new WebSocket(url) Ø§ÛØ¬Ø§Ø¯ Ù
ÛâØ´ÙØ¯, Ø¨ÙØ§ÙاصÙÙ Ø´Ø±ÙØ¹ ب٠اتصا٠Ù
ÛÚ©ÙØ¯.
درطÙÙ Ø§ØªØµØ§ÙØ ٠رÙگر (با Ø§Ø³ØªÙØ§Ø¯Ù از ÙØ¯Ø±Ùا) از Ø³Ø±ÙØ± Ø³ÙØ§Ù Ù ÛÚ©ÙØ¯: âØ¢ÛØ§ از ÙØ¨ سÙکت Ù¾Ø´ØªÛØ¨Ø§ÙÛ Ù ÛÚ©ÙÛØâ ٠اگر Ø³Ø±ÙØ± Ø¬ÙØ§Ø¨ ٠ثبت Ø¨Ø¯ÙØ¯Ø Ø¢Ùگا٠٠کاÙ٠٠در Ù¾Ø±ÙØªÙÚ©Ù ÙØ¨ سÙکت ادا٠٠٠ÛâÛØ§Ø¨Ø¯ Ú©Ù Ø¨Ù Ø§ØµÙØ§ HTTP ÙÛØ³Øª.
در Ø²ÛØ± ÙÙ
ÙÙÙâØ§Û Ø§Ø² ÙØ¯Ø±ÙØ§Û Ù
Ø±ÙØ±Ú¯Ø± در Ø¯Ø±Ø®ÙØ§Ø³Øª new WebSocket("wss://javascript.info/chat") Ø¢ÙØ±Ø¯Ù شد٠است.
GET /chat
Host: javascript.info
Origin: https://javascript.info
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: Iv8io/9s+lYFgZWcXczP8Q==
Sec-WebSocket-Version: 13
Origin--ÙØ³ØªÙد. ÙÛÚ ÙØ¯Ø±Ø®Ø§Øµ Ù ÛØ§ دÛگر Ù ØØ¯ÙØ¯ÛØªÛ ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯. Ø¯Ø±ÙØ±ØµÙرت Ø³Ø±ÙØ±ÙØ§Û ÙØ¯ÛÙ Û ÙØ§Ø¯Ø± ب٠کار با ÙØ¨ سÙکت ÙØ§ ÙÛØ³ØªÙد. Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ ÙÛÚÚ¯ÙÙÙ Ù Ø´Ú©Ù Ø³Ø§Ø²Ú¯Ø§Ø±Û ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯. ا٠ا اÛÙ ÙØ¯Ø± Ù Ù٠است ÚÙÙ Ø¨Ù Ø³Ø±ÙØ± اÛ٠اجاز٠را Ù ÛØ¯Ùد تا Ø¯Ø±Ù ÙØ±Ø¯ ارتباط با ÙØ¨Ø³Ø§Ûت از طرÛÙ ÙØ¨ سÙکت تص٠ÛÙ Ø¨Ú¯ÛØ±Ø¯. cross-origin آبجکتâÙØ§Û ÙØ¨ سÙکت ذاتا .https://javascript.infoØ®ÙØ§Ø³ØªÚ¯Ø§Ù ØµÙØÙ Ø¯Ø± س٠ت Ú©ÙØ§ÛÙØª Ø¨Ø±Ø§Û Ù Ø«Ø§ÙConnection: Upgradeâ Ø¹ÙØ§Ù ØªÛ ÙÙ Ø§ÛØ§Ùگر Ø¢ÙÚ©Ù Ú©ÙØ§ÛÙØª Ø®ÙØ§Ùا٠تغÛÛØ± Ù¾Ø±ÙØªÙÚ©Ù Ù ÛØ¨Ø§Ø´Ø¯.Upgrade: websocketâ Ù¾Ø±ÙØªÙÚ©Ù Ø¯Ø±Ø®ÙØ§Ø³ØªÛ âÙØ¨ سÙکتâ Ù ÛØ¨Ø§Ø´Ø¯Sec-WebSocket-Keyâ ÛÚ© Ú©ÙÛØ¯ تصادÙÛ Ú©Ù ØªÙØ³Ø· Ù Ø±ÙØ±Ú¯Ø± Ø³Ø§Ø®ØªÙ Ù ÛØ´Ùد Ù Ø¨Ø±Ø§Û Ø§Ø·Ù ÛÙØ§Ù از اÛÙÚ©Ù Ø¢ÛØ§ Ø³Ø±ÙØ± از ÙØ¨ سÙکت Ù¾Ø´ØªÛØ¨Ø§ÙÛ Ù ÛÚ©ÙØ¯ ÛØ§ ÙÙ Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛØ´Ùد. اÛÙ Ú©ÙÛØ¯ Ø¨Ù ØµÙØ±Øª تصادÙÛ Ø§Ø³Øª تا از cache Ú©Ø±Ø¯Ù ÙØ± ÙÙØ¹ Ø§Ø±ØªØ¨Ø§Ø·Û ØªÙØ³Ø· پرÙکسÛâÙØ§ جÙÙÚ¯ÛØ±Û Ú©ÙØ¯Sec-WebSocket-Versionâ ÙØ±ÚÙ Ù¾Ø±ÙØªÙÚ©Ù ÙØ¨ سÙÚ©ØªØ ÙØ³Ø®Ù Ú©ÙÙÙÛ 13 Ù ÛØ¨Ø§Ø´Ø¯
ÙÙ
ÛØªÙاÙÛÙ
از XMLHttpRequest ÛØ§ fetch Ø¨Ø±Ø§Û Ø³Ø§Ø®Øª اÛÙ ÙÙØ¹ از HTTP-request Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
ÚÙÙ Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت اجازÙâÛ ØªÙØ¸ÛÙ
اÛÙ ÙØ¯Ø±Ùارا ÙØ¯Ø§Ø±Ø¯.
اگر Ø³Ø±ÙØ± با تعÙÛØ¶ Ø¨Ù Ù¾Ø±ÙØªÙÚ©Ù ÙØ¨ سÙکت Ù ÙØ§ÙÙØª Ú©ÙØ¯ Ø¢ÙÚ¯Ø§Ù Ø¨Ø§ÛØ¯ کد 101 را در پاسخ Ø§Ø±Ø³Ø§Ù Ú©ÙØ¯
101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g=
اÛÙØ¬Ø§ Sec-WebSocket-Accept ÙÙ
ا٠Sec-WebSocket-Key Ø§Û ÙØ³Øª Ú©Ù ØªÙØ³Ø· ÛÚ© اÙÚ¯ÙØ±ÛتÙ
خاص Ø¯ÙØ¨Ø§Ø±Ù Ú©Ø¯Ú¯Ø°Ø§Ø±Û Ø´Ø¯Ù Ø§Ø³Øª. با Ø¯ÛØ¯Ù Ø¢ÙØ Ù
Ø±ÙØ±Ú¯Ø± Ù
ØªÙØ¬Ù Ù
ÛØ´Ùد Ú©Ù Ø³Ø±ÙØ± ÙØ§Ùعا از Ù¾Ø±ÙØªÙÚ©Ù ÙØ¨ سÙکت Ù¾Ø´ØªÛØ¨Ø§ÙÛ Ù
ÛÚ©ÙØ¯
سپس Ø§Ø·ÙØ§Ø¹Ø§Øª بر بستر Ù¾Ø±ÙØªÙÚ©Ù ÙØ¨ سÙکت Ø§ÙØªÙØ§Ù Ù¾ÛØ¯Ø§ Ù ÛÚ©ÙÙØ¯, Ú©Ù Ø¨Ù Ø²ÙØ¯Û با ساختار Ø¢Ù (âframesâ) Ø¢Ø´ÙØ§ Ù ÛØ´ÙÛÙ .
Ø§ÙØ²ÙÙÙ ÙØ§ Ù Ø²ÛØ±Ù¾Ø±ÙتÙÚ©ÙâÙØ§
اÙ
کا٠دارد Ú©Ù ÙØ¯Ø±ÙØ§Û Ø§Ø¶Ø§ÙÛ ÙÙ
ÚÙÙ Sec-WebSocket-Extensions Ù Sec-WebSocket-Protocol ÙØ¬Ùد Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´ÙØ¯ Ú©Ù Ø¨ÛØ§Ùگر Ø§ÙØ²ÙÙÙ(extension)ÙØ§ Ù Ø²ÛØ±Ù¾Ø±ÙتÙÚ©ÙâÙØ§(subprotocols) ÙØ³ØªÙد.
Ø¨Ø±Ø§Û Ù Ø«Ø§Ù:
-
Sec-WebSocket-Extensions: deflate-frameÙÙ Ø§ÛØ§Ùگر آ٠است ک٠٠رÙگر ÙØ´Ø±Ø¯ÙâØ³Ø§Ø²Û Ø§Ø·ÙØ§Ø¹Ø§Øª را Ù¾Ø´ØªÛØ¨Ø§ÙÛ Ù ÛÚ©ÙØ¯. ÛÚ© Ø§ÙØ²ÙÙÙ Ø¨Ù Ø§ÙØªÙØ§Ù Ø§Ø·ÙØ§Ø¹Ø§Øª ٠رتبط است. سازÙÚ©Ø§Ø±Û Ú©Ù Ù¾Ø±ÙØªÙÚ©Ù ÙØ¨ سÙکت را گسترش Ù ÛØ¯Ùد.Sec-WebSocket-Extensions: deflate-frameØ¨Ù ØµÙØ±Øª Ø®ÙØ¯Ú©Ø§Ø± ØªÙØ³Ø· ٠رÙگر Ø§Ø±Ø³Ø§Ù Ù ÛØ´Ùد Ù ØØ§ÙÛ ÙÛØ³ØªÛ از ÙÙ ÙâÛ Ø§ÙØ²ÙÙÙ ÙØ§ÛÛ Ú©Ù Ù¾Ø´ØªÛØ¨Ø§ÙÛ Ù ÛÚ©ÙØ¯ Ù ÛØ¨Ø§Ø´Ø¯. -
Sec-WebSocket-Protocol: soap, wampب٠اÛ٠٠عÙÛ Ø§Ø³Øª ک٠٠ا ÙÙ ÛØ®ÙاÙÛÙ ÙØ± Ø¯ÛØªØ§ÛÛ Ø±Ø§ ارسا٠کÙÛ٠بÙÚ©Ù Ø¯ÛØªØ§Û در SOAP ÛØ§ WAMP (âÙ¾Ø±ÙØªÙÚ©Ù Ù¾ÛØ§Ù رساÙÛ Ø§Ø² طرÛÙ ÙØ¨ سÙکتâ). Ø²ÛØ±Ù¾Ø±ÙتÙÚ©Ù ÙØ§Û ÙØ¨ سÙکت در IANA catalogue ÙÛØ³Øª Ø´Ø¯Ù Ø§ÙØ¯. Ø¨ÙØ§Ø¨Ø±Ø§Û٠اÛÙ ÙØ¯Ø± ÙØ±Ù ت Ø¯ÛØªØ§ÛÛ Ú©Ù Ù ÛØ®ÙاÙÛÙ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛ٠را ØªÙØµÛÙ Ù ÛÚ©ÙØ¯.اÛÙ ÙØ¯Ø± Ø§Ø®ØªÛØ§Ø±Û با Ø§Ø³ØªÙØ§Ø¯Ù از دÙÙ Û٠پارا٠تر
new websocketØªÙØ¸ÛÙ Ù ÛØ´Ùد ک٠آراÛÙ Ø§Û Ø§Ø² subprotocol ÙØ§Ø³Øª. Ø¨Ø±Ø§Û Ù Ø«Ø§Ù Ø§Ú¯Ø± Ø¨Ø®ÙØ§ÙÛ٠از SOAP ÛØ§ WAWP Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛ٠دارÛÙ :let socket = new WebSocket("wss://javascript.info/chat", ["soap", "wamp"]);
Ø³Ø±ÙØ± Ø¨Ø§ÛØ¯ با ÙÛØ³ØªÛ از Ù¾Ø±ÙØªÙÚ©ÙâÙØ§ Ù extension ÙØ§ÛÛ Ú©Ù Ø¨Ø§ Ø§Ø³ØªÙØ§Ø¯Ù از Ø¢ÙÙØ§ Ù ÙØ§Ù٠است پاسخ Ø¯ÙØ¯
Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ Ø¯Ø±Ø®ÙØ§Ø³Øª:
GET /chat
Host: javascript.info
Upgrade: websocket
Connection: Upgrade
Origin: https://javascript.info
Sec-WebSocket-Key: Iv8io/9s+lYFgZWcXczP8Q==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: deflate-frame
Sec-WebSocket-Protocol: soap, wamp
پاسخ:
101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g=
Sec-WebSocket-Extensions: deflate-frame
Sec-WebSocket-Protocol: soap
اÛÙØ¬Ø§ Ø³Ø±ÙØ± پاسخ Ù ÛØ¯Ùد Ú©Ù extension âdeflate-frameâ ٠تÙÙØ§ SOAP subprotocol ÙØ§ را Ù¾Ø´ØªÛØ¨Ø§ÙÛ Ù ÛÚ©ÙØ¯.
Ø§ÙØªÙØ§Ù Ø§Ø·ÙØ§Ø¹Ø§Øª
ارتباط از طرÛÙ ÙØ¨ سÙکت از âframeâ ÙØ§ ÛØ§ Ù٠ا٠برشâÙØ§ÛÛ Ø§Ø² Ø§Ø·ÙØ§Ø¹Ø§Øª Ø³Ø§Ø®ØªÙ Ø´Ø¯Ù Ú©Ù Ù ÛØªÙØ§ÙØ¯ از ÙØ± س٠ت ارسا٠شد٠٠اÙÙØ§Ø¹ Ù ØªÙØ§ÙØªÛ Ø¯Ø§Ø´ØªÙ Ø¨Ø§Ø´Ø¯:
- âtext framesâ â Ø¯ÛØªØ§Û Ù ØªÙÛ Ø±Ø¯ÙØ¨Ø¯Ù شد٠را شا٠٠٠ÛâØ´ÙØ¯.
- âbinary data framesâ â Ø¯ÛØªØ§Û Ø¨Ø§ÛÙØ±Û رد ٠بد٠شد٠را شا٠٠٠ÛâØ´ÙØ¯.
- âping/pong framesâ â Ø¨Ø±Ø§Û Ø¨Ø±Ø±Ø³Û Ø§ØªØµØ§Ù Ø§Ø² س٠ت Ø³Ø±ÙØ± ارسا٠٠ÛâØ´ÙØ¯ Ù Ù Ø±ÙØ±Ú¯Ø± Ø¨Ù ØµÙØ±Øª Ø®ÙØ¯Ú©Ø§Ø± ب٠آ٠پاسخ Ù ÛâØ¯ÙØ¯.
- ÙÙ ÚÙÛÙ ÙØ±ÛÙ Û Ø¨Ù ÙØ§Ù âconnection close frameâ ٠تعداد دÛÚ¯Ø±Û Ø§Ø² سرÙÛØ³ ÙØ±ÛÙ âÙØ§ ÙØ¬Ùد Ø¯Ø§Ø±ÙØ¯.
در Ù Ø±ÙØ±Ú¯Ø±Ø ٠ا ٠ستÙÛ٠ا با Ù ØªÙ ÛØ§ binary frames کار Ù ÛÚ©ÙÛÙ .
Ù
تد ()send. ÙØ¨ سÙکت ØªÙØ§ÙاÛÛ Ø§Ø±Ø³Ø§Ù ÙÙ
Ù
ت٠٠ÙÙ
Ø¯ÛØªØ§Û باÛÙØ±Û را دارا Ù
ÛØ¨Ø§Ø´Ø¯
صدا زد٠socket.send(body) اجازÙâÛ Ø§Ø³ØªÙØ§Ø¯Ù از ÙÙ
رشت٠٠ÙÙ
ÙØ±Ù
ت باÛÙØ±Û را در body Ù
ÛâØ¯ÙØ¯ ک٠شاÙ
Ù Blob, ArrayBuffer Ù Ù
ÙØ§Ø±Ø¯ Ù
شاب٠Ù
ÛØ¨Ø§Ø´Ø¯. ÙÛÚ ØªÙØ¸ÛÙ
Ø§ØªÛ ÙÛØ§Ø² ÙÛØ³Øª: Ù
ÛØªÙاÙÛØ¯ با ÙØ± ÙØ±Ù
ØªÛ Ø§Ø±Ø³Ø§ÙØ´ Ú©ÙÛØ¯.
ÙÙگاÙ
Ø¯Ø±ÛØ§Ùت Ø¯ÛØªØ§Ø Ù
ت٠ÙÙ
ÛØ´Ù Ø¨Ù ØµÙØ±Øª رشت٠Ù
ÛâØ¢ÛØ¯. Ù Ø¨Ø±Ø§Û Ø¯ÛØªØ§Û باÛÙØ±Û Ù
ÛØªÙاÙÛÙ
بÛÙ ÙØ±Ù
تâÙØ§Û Blob Ù ArrayBuffer Ø§ÙØªØ®Ø§Ø¨ Ú©ÙÛÙ
ک٠با Ù
شخص٠socket.binaryType ÙØ§Ø¨Ù ØªÙØ¸ÛÙ
Ø¨ÙØ¯Ù Ù Ø¨Ù ØµÙØ±Øª Ù¾ÛØ´Ùرض ""blob"" است Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ Ø¯ÛØªØ§Û باÛÙØ±Û ب٠شک٠آبجکتâÙØ§Û Blob Ø¯Ø±ÛØ§Ùت Ù
ÛâØ´ÙØ¯.
تغÛÛØ± دÙÛÙ
. "arraybuffer" ٠دÛگر تگ ÙØ§ ادغاÙ
Ù
ÛØ´Ùد Ø¨ÙØ§Ø¨Ø±Ø§ÛÙ Ù
ÙØ¯Ø§Ø± Ù¾ÛØ´Ùرض Ù
ÙØ·ÙÛ Ø®ÙØ§Ùد Ø¨ÙØ¯. اÙ
ا Ø¨Ø±Ø§Û Ø¯ÛØªØ§Û باÛÙØ±Û Ù
ÛØªÙاÙÛÙ
Ø¢ÙØ±Ø§ ب٠<img> Ù <a> آبجکت باÛÙØ±Û Ø³Ø·Ø Ø¨Ø§ÙØ§ÛÛ Ø§Ø³Øª Ú©Ù Ø¨Ù ØµÙØ±Øª Ù
ستÙÛÙ
با Blob
socket.binaryType = "arraybuffer";
socket.onmessage = (event) => {
// event.data is either a string (if text) or arraybuffer (if binary)
};
Ù ØØ¯Ùد Ú©Ø±Ø¯Ù ÙØ±Ø®
ØªØµÙØ± Ú©ÙÛØ¯ Ú©Ù Ø¨Ø±ÙØ§Ù ÙâÛ Ù Ø§ Ù ÙØ¯Ø§Ø± Ø²ÛØ§Ø¯Û Ø¯ÛØªØ§ ارسا٠٠ÛÚ©ÙØ¯ ا٠ا اÛÙØªØ±Ùت کاربر سرعت پاÛÛÙÛ Ø¯Ø§Ø±Ø¯ Ø´Ø§ÛØ¯ بش٠اÛÙØªØ±Ùت Ù٠را٠خارج از Ø´ÙØ± ر٠٠ثا٠زد.
Ù
ا socket.send(data) را Ø¨Ø§Ø±ÙØ§ Ù Ø¨Ø§Ø±ÙØ§ صدا Ù
ÛØ²ÙÛÙ
. اÙ
ا Ø¯ÛØªØ§ در ØØ§ÙØ¸Ù Ø¨Ø§ÙØ± (Ø°Ø®ÛØ±Ù) شد٠٠زÙ
اÙÛ Ú©Ù Ø³Ø±Ø¹Øª Ø´Ø¨Ú©Ù Ø¨Ù ØØ¯ کاÙÛ Ø¨Ø±Ø³Ø¯ Ø¨Ù Ø¨ÛØ±ÙÙ Ø§Ø±Ø³Ø§Ù Ø®ÙØ§Ùد شد.
Ù
شخص٠socket.bufferedAmount تعداد Ø¨Ø§ÛØªâÙØ§Û Ø°Ø®ÛØ±Ù Ø´Ø¯Ù Ø¯Ø±ÙØØ¸Ù Ù Ø¯Ø±ØØ§Ù Ø§ÙØªØ¸Ø§Ø± Ø¨Ø±Ø§Û Ø§Ø±Ø³Ø§Ù ØªØØª شبک٠را Ø°Ø®ÛØ±Ù Ù
ÛâÚ©ÙØ¯.
با Ø§Ø±Ø²ÛØ§Ø¨Û اÛ٠پارا٠تر Ù ÛØªÙÙÛ٠بÙÙÙ ÛÙ Ú©Ù Ø¢ÛØ§ سÙکت ÙØ§Ùعا Ø¨Ø±Ø§Û Ø§ÙØªÙا٠دردسترس است ÛØ§ ÙÙ
// ÙØ± صد Ù
ÛÙÛ Ø«Ø§ÙÛ٠سÙکت را Ø¨Ø±Ø±Ø³Û Ú©Ø±Ø¯Ù Ù Ø¯ÛØªØ§Û Ø¨ÛØ´ØªØ±Û را ارسا٠Ù
ÛÚ©ÙØ¯
// تÙÙØ§ زÙ
اÙÛ Ú©Ù ÙÙ
ÙâÛ Ø¯ÛØªØ§Û Ù
ÙØ¬Ùد ارسا٠شد٠باشد
setInterval(() => {
if (socket.bufferedAmount == 0) {
socket.send(moreData());
}
}, 100);
بست٠اتصاÙ
Ø¨Ù Ø·ÙØ± ٠ع٠ÙÙÛ Ø²Ù Ø§ÙÛ Ú©Ù ÛÚ© Ø·Ø±Ù ÙØµØ¯ بست٠اتصا٠را داشت٠باشد(ÙØ± دÙÛ Ù Ø±Ùگر Ù Ø³Ø±ÙØ± ØÙ Ø¨Ø±Ø§Ø¨Ø±Û Ø¨Ø±Ø§Û Ø§ÛÙکار دارا ÙØ³ØªÙد.), Ø¢ÙÙØ§ عبارت âconnection close frameâ Ø±Ø§ ب٠Ù٠را٠ÛÚ© کد Ø¹Ø¯Ø¯Û Ù Ø¯ÙÛ٠اÛÙکار را ب٠شک٠٠تÙÛ Ø§Ø±Ø³Ø§Ù Ù ÛÚ©ÙÙØ¯.
Ø±ÙØ´ Ø§ÙØ¬Ø§Ù اÛ٠کار Ø¨Ù Ø´Ú©Ù Ø²ÛØ± است:
socket.close([code], [reason]);
codeÛÚ© کد خاص Ø¨Ø±Ø§Û Ø¨Ø³ØªÙ ÙØ¨ سÙکت (Ø§Ø®ØªÛØ§Ø±Û)reasonرشتÙâØ§Û Ú©Ù Ø¹ÙØª بست٠اتصا٠را ØªÙØ¶ÛØ Ù ÛâØ¯ÙØ¯ (Ø§Ø®ØªÛØ§Ø±Û)
سپس طر٠دÛگر رÙÛØ¯Ø§Ø¯ کد close Ù Ø¹ÙØª Ø¢ÙØ±Ø§ Ø¯Ø±ÛØ§Ùت Ù
ÛÚ©ÙØ¯. Ø¨Ø±Ø§Û Ù
ثاÙ:
// سÙ
ØªÛ Ú©Ù Ø§Ø±ØªØ¨Ø§Ø· را Ù
ÛØ¨Ùدد:
socket.close(1000, "Work complete");
// سÙ
ت دÛگر:
socket.onclose = event => {
// event.code === 1000
// event.reason === "Work complete"
// event.wasClean === true (clean close)
};
Ø±Ø§ÛØ¬Ø¹âترÛÙ Ú©Ø¯ÙØ§ Ù Ù ÙØ§Ø¯Ûر Ø¢ÙÙØ§:
1000â Ø¨Ø³ØªÙ Ù¾ÛØ´âÙØ±Ø¶ Ù Ø¹Ø§Ø¯Û (ز٠اÙÛ Ú©ÙcodeÙØ¨Ø§Ø´Ø¯ Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛâØ´ÙØ¯),1006â Ø±Ø§ÙÛ Ø¨Ø±Ø§Û ØªÙØ¸Û٠اÛ٠کد Ø¨Ù ØµÙØ±Øª Ø¯Ø³ØªÛ ÙØ¬Ùد ÙØ¯Ø§Ø´ØªÙ Ù ÙÙ Ø§ÛØ§Ùگر از دست Ø±ÙØªÙ ارتباط ÙØ³Øª (no close frame)
Ú©Ø¯ÙØ§Û دÛگر Ù Ø«Ù Ù ÙØ§Ø±Ø¯ Ø²ÛØ± ÙÙ ÙØ¬Ùد Ø¯Ø§Ø±ÙØ¯:
1001â the party is going away, e.g. server is shutting down, or a browser leaves the page,1009â ØØ¬Ù Ù¾ÛØ§Ù Ø¨Ø±Ø§Û Ø§ÙØ¬Ø§Ù پردازش Ø²ÛØ§Ø¯ است,1011â Ø®Ø·Ø§Û Ù¾ÛØ´âبÛÙÛ ÙØ´Ø¯Ù در Ø³Ø±ÙØ±,- â¦Ù ØºÛØ±Ù.
ÙÛØ³Øª Ú©Ø§Ù Ù Ø±Ù Ù ÛØªÙÙÛØ¯ در RFC6455, §7.4.1 Ù¾ÛØ¯Ø§ Ú©ÙÛØ¯.
Ú©Ø¯ÙØ§Û ÙØ¨ سÙکت ØªØ§ØØ¯Û Ù
Ø´Ø§Ø¨Ù Ú©Ø¯ÙØ§Û HTTP Ù
ÛØ¨Ø§Ø´Ùد اÙ
ا Ù
ØªÙØ§ÙØªÙØ¯. Ø¨Ù ØµÙØ±Øª خاص Ú©Ø¯ÙØ§Û Ú©Ù
تر از 1000 از ÙØ¨Ù Ø±Ø²Ø±Ù Ø´Ø¯Ù Ø§ÙØ¯ ٠اگر ØªÙØ§Ø´ Ú©ÙÛÙ
تا ÛÚ©Û Ø§Ø² اÛÙ Ú©Ø¯ÙØ§Ø±Ù Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛÙ
Ø¨Ù Ø§Ø±ÙØ± Ø¨Ø±Ø®ÙØ±Ø¯ Ø®ÙØ§ÙÛÙ
کرد.
// اگر ارتباط Ø¯ÚØ§Ø± Ù
شک٠باشد:
socket.onclose = event => {
// event.code === 1006
// event.reason === ""
// event.wasClean === false (no closing frame)
};
ÙØ¶Ø¹Ûت اتصاÙ
Ø¨Ø±Ø§Û Ø§Ø·ÙØ§Ø¹ از ÙØ¶Ø¹Ûت Ø§ØªØµØ§Ù Ù¾Ø±Ø§Ù¾Ø±ØªÛ socket.readyState با Ù
ÙØ§Ø¯Ûر Ø²ÛØ± ÙØ¬Ùد دارد:
0â âCONNECTINGâ: اتصا٠ÙÙÙØ² Ø¨Ø±ÙØ±Ø§Ø± ÙØ´Ø¯Ù است,1â âOPENâ: Ø¯Ø±ØØ§Ù Ø¨Ø±ÙØ±Ø§Ø±Û ارتباط,2â âCLOSINGâ: Ø¯Ø±ØØ§Ù بست٠ارتباط,3â âCLOSEDâ: ارتباط بست٠شد٠است.
Ù Ø«Ø§Ù ÚØª
Ø¨ÛØ§Ûد تا با ÙÙ ÛÚ© ٠ثا٠از Ù¾ÛØ§Ø¯ÙâØ³Ø§Ø²Û ÛÚ© Ø¨Ø±ÙØ§Ù Ù ÚØª را Ø¨Ø§Ø§Ø³ØªÙØ§Ø¯Ù از Ø§Û Ù¾Û Ø¢Û ÙØ¨ سÙکت ٠٠اÚÙÙ ÙØ¨ سÙکت node.js https://github.com/websockets/ws Ø¨Ø±Ø±Ø³Û Ú©ÙÛÙ . ت٠رکز اصÙÛ Ù Ø§ س٠ت Ú©ÙØ§ÛÙØª Ø®ÙØ§Ùد Ø¨ÙØ¯ ا٠ا س٠ت Ø³Ø±ÙØ± Ù٠ساد٠است.
کد HTML: ÙÛØ§Ø² ب٠ÛÚ© تگ <form> Ø¨Ø±Ø§Û Ø§Ø±Ø³Ø§Ù Ù¾ÛØ§Ù
ÙØ§ Ù ÛÚ© تگ <div> Ø¨Ø±Ø§Û Ù¾ÛØ§Ù
ÙØ§Û Ø¯Ø±ÛØ§ÙØªÛ Ø¯Ø§Ø±ÛÙ
<!-- message form -->
<form name="publish">
<input type="text" name="message">
<input type="submit" value="Send">
</form>
<!-- div with messages -->
<div id="messages"></div>
Ø¨Ø±Ø§Û Ú©Ø¯ÙØ§Û Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ø¨Ø±ÙØ§Ù ٠٠ا ÙÛØ§Ø² ب٠س٠ÚÛØ² دارÛÙ :
- Ø§ÛØ¬Ø§Ø¯ اتصاÙ.
- On form submission â
socket.send(message)for the message. - On incoming message â append it to
div#messages.
کد ر٠ب٠اÛÙØµÙرت Ø®ÙØ§ÙÛ٠داشت:
let socket = new WebSocket("wss://javascript.info/article/websocket/chat/ws");
// Ø§Ø±Ø³Ø§Ù Ù¾ÛØ§Ù
از ÙØ±Ù
document.forms.publish.onsubmit = function() {
let outgoingMessage = this.message.value;
socket.send(outgoingMessage);
return false;
};
// div#messagesÙ¾ÛØ§Ù
Ø¯Ø±ÛØ§Ùت شد - ÙÙ
Ø§ÛØ´ Ù¾ÛØ§Ù
در
socket.onmessage = function(event) {
let message = event.data;
let messageElem = document.createElement('div');
messageElem.textContent = message;
document.getElementById('messages').prepend(messageElem);
}
کد س٠ت Ø³Ø±ÙØ± ÛÚ© Ù ÙØ¯Ø§Ø± ÙØ±Ø§ØªØ± از Ø¨ØØ« ٠ا ÙØ³Øª. اÛÙØ¬Ø§ ٠ا از node.js Ø§Ø³ØªÙØ§Ø¯Ù Ù ÛÚ©ÙÛÙ , ا٠ا ش٠ا Ù Ø¬Ø¨ÙØ± ÙÛØ³ØªÛد. دÛگر Ù¾ÙØªÙÙØ±Ù âÙØ§ Ø±ÙØ´âÙØ§Û خاص Ø®ÙØ¯Ø´ÙÙ Ø±Ù Ø¨Ø±Ø§Û Ú©Ø§Ø± با ÙØ¨ سÙکت دارا ÙØ³ØªÙد.
اÙÚ¯ÙØ±Ûت٠س٠ت Ø³Ø±ÙØ± ب٠اÛÙØµÙرت Ø®ÙØ§Ùد Ø¨ÙØ¯:
- Create
clients = new Set()--از سÙکت ÙØ§ set ÛÚ© - ØªÙØ¸ÛÙ
Ú©ÙÛØ¯ event listener را Ø¨Ø±Ø§Û Ø¯Ø±ÛØ§Ùت Ù¾ÛØ§Ù
ÙØ§Û Ù
Ø±Ø¨ÙØ· بÙ
messageاضاÙ٠کرد٠٠set بÙclients.add(socket)ÙØ± ÛÚ© از ÙØ¨ سÙکت ÙØ§Û Ù¾Ø°ÛØ±Ùت٠شد٠را با - ز٠اÙÛ Ú©Ù ÛÚ© Ù¾ÛØ§Ù Ø¯Ø±ÛØ§Ùت Ù ÛâØ´ÙØ¯: بر رÙÛ Ú©ÙØ§ÛÙØªâÙØ§ Ù¾ÙÛØ´ Ú©Ø±Ø¯Ù Ù Ø¢ÙØ±Ø§ ب٠Ù٠٠ارسا٠کÙ
- زÙ
اÙÛ Ú©Ù ÛÚ© اتصا٠بست٠Ù
ÛØ´Ùد:
clients.delete(socket)
const ws = new require('ws');
const wss = new ws.Server({noServer: true});
const clients = new Set();
http.createServer((req, res) => {
// در اÛÙØ¬Ø§ ÙÙØ· ارتباط ÙØ¨ سÙکت را Ú©ÙØªØ±Ù Ù
ÛÚ©ÙÛÙ
// در پرÙÚÙâ ÙØ§ÙØ¹Û Ú©Ø¯ÙØ§Û دÛÚ¯Ø±Û Ø¨Ø±Ø§Û Ø±Ø³ÛØ¯Ú¯Û Ø¨Ù Ø¯Ø±Ø®ÙØ§Ø³ØªâÙØ§Û ØºÛØ± ÙØ¨ سÙکت Ø®ÙØ§ÙÛÙ
داشت
wss.handleUpgrade(req, req.socket, Buffer.alloc(0), onSocketConnect);
});
function onSocketConnect(ws) {
clients.add(ws);
ws.on('message', function(message) {
message = message.slice(0, 50); // ØØ¯Ø§Ú©Ø«Ø± Ø·ÙÙ 50 را Ù
ÛØªÙØ§ÙØ¯ دارا باشد
for(let client of clients) {
client.send(message);
}
});
ws.on('close', function() {
clients.delete(ws);
});
}
ÛÚ© ٠ثاÙ:
Ø´Ù
ا ÙÙ
ÚÙÛÙ Ù
ÛØªÙÙÛØ¯ اÛÙ Ù
ثا٠ر٠داÙÙÙØ¯ کرد٠(دکÙ
Ù Ø¨Ø§ÙØ§ سÙ
ت راست در Ø¢ÛÙØ±ÛÙ
) ٠در ÙÙÚ©Ø§Ù Ø®ÙØ¯ØªÙ٠اجرا Ú©ÙÛØ¯. ÙÙØ· ÙØ±Ø§Ù
ÙØ´ ÙÚ©ÙÛØ¯ Ú©Ù Node.js Ø±Ù ÙØµØ¨ Ú©Ø±Ø¯Ù Ù Ø¯Ø³ØªÙØ± npm install ws Ø±Ù ÙØ¨Ù از Ø±Ø§Ù Ø§ÙØ¯Ø§Ø²Û اجرا Ú©ÙÛØ¯
Ø®ÙØ§ØµÙ
ÙØ¨ سÙکت ÛÚ© Ø±Ø§Ù Ù Ø¯Ø±Ù Ø¨Ø±Ø§Û Ø¯Ø§Ø´ØªÙ ÛÚ© ارتباط Ù Ø±ÙØ±Ú¯Ø±-Ø³Ø±ÙØ± ٠ست٠ر Ù ÛØ¨Ø§Ø´Ø¯.
- ÙØ¨ سÙکتâÙØ§ Ù ØØ¯ÙØ¯ÛØª cross origin ÙØ¯Ø§Ø±Ùد.
- Ø¨Ù Ø®ÙØ¨Û در Ù Ø±ÙØ±Ú¯Ø±Ùا Ù¾Ø´ØªÛØ¨Ø§ÙÛ Ù ÛØ´ÙÙØ¯.
- Ù ÛØªÙاÙÙØ¯ Ø§Ø·ÙØ§Ø¹Ø§Øª را ب٠شک٠رشت٠٠باÛÙØ±Û ارساÙ/Ø¯Ø±ÛØ§Ùت Ú©ÙÙØ¯
Ú©Ù API Ø³Ø§Ø¯Ù Ø§Û Ø§Ø³Øª
Ø±ÙØ´âÙØ§:
socket.send(data),socket.close([code], [reason]).
رÙÛØ¯Ø§Ø¯Ùا:
open,message,error,close.
ÙØ¨ سÙکت ب٠تÙÙØ§ÛÛ Ø´Ø§Ù Ù Ø§Ù Ú©Ø§ÙØ§ØªÛ ÙÙ ÚÙÙ Ø§ØªØµØ§Ù Ø¯ÙØ¨Ø§Ø±Ù, Ø§ØØ±Ø§Ø² ÙÙÛØª ٠دÛگر ٠کاÙÛØ²Ù âÙØ§Û Ø³Ø·Ø Ø¨Ø§ÙØ§ ÙÙ ÛØ¨Ø§Ø´Ø¯. Ø¨ÙØ§Ø¨Ø±Ø§Û٠کتابخاÙÙ ÙØ§ÛÛ Ù٠در Ú©ÙØ§ÛÙØª Ù Ù٠در Ø³Ø±ÙØ± Ø¨Ø±Ø§Û Ø§ÛÙکار ÙØ¬Ùد Ø¯Ø§Ø±ÙØ¯Ø ÙÙ ÚÙÛÙ Ù¾ÛØ§Ø¯ÙâØ³Ø§Ø²Û Ø¯Ø³ØªÛ Ø§ÛÙ Ù ÙØ§Ø±Ø¯ Ø§Ù Ú©Ø§Ù Ù¾Ø°ÛØ± Ù ÛØ¨Ø§Ø´Ø¯.
گاÙÛ Ø§ÙÙØ§ØªØ Ø¨Ø±Ø§Û Ø§ÙØ²ÙØ¯Ù ÙØ¨ سÙکت ب٠ÛÚ© پرÙÚÙâØ Ø§ÙØ±Ø§Ø¯ ÛÚ© Ø³Ø±ÙØ± ÙØ¨ سÙکت ب٠Ù
ÙØ§Ø²Ø§Øª Ø³Ø±ÙØ± http را با ÛÚ© Ø¯ÛØªØ§Ø¨Ûس Ù
شترک Ø±Ø§Ù Ø§ÙØ¯Ø§Ø²Û Ù
ÛÚ©ÙÙØ¯. Ø¯Ø±Ø®ÙØ§Ø³Øª ÙØ§Û ÙØ¨ سÙکت از آدرس wss://ws.site.com Ú©Ù ÛÚ© ساب داÙ
ÛÙ Ø¨ÙØ¯Ù Ù Ø¨Ù Ø³Ø±ÙØ± ÙØ¨ سÙکت Ù
ÛØ±Ø³Ø¯ Ø§Ø³ØªÙØ§Ø¯Ù Ù
ÛÚ©ÙÙØ¯ Ø¯Ø±ØØ§ÙÛ Ú©Ù Ø¯Ø±Ø®ÙØ§Ø³Øª ÙØ§Û آدرس https://site.com Ø¨Ù Ø³Ø±ÙØ± http اصÙÛ Ù
ÛØ±ÙÙØ¯.
Ù Ø·Ù Ø¦ÙØ§ راÙÙØ§Û دÛÚ¯Ø±Û Ø¨Ø±Ø§Û Ø§Ø¯ØºØ§Ù ÙØ¬Ùد دارد.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)