ÐÑоÑокол WebSocket (ÑÑандаÑÑ RFC 6455) пÑедназнаÑен Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð»ÑбÑÑ
Ð·Ð°Ð´Ð°Ñ Ð¸ ÑнÑÑÐ¸Ñ Ð¾Ð³ÑаниÑений обмена даннÑми Ð¼ÐµÐ¶Ð´Ñ Ð±ÑаÑзеÑом и ÑеÑвеÑом.
Ðн позволÑÐµÑ Ð¿ÐµÑеÑÑлаÑÑ Ð»ÑбÑе даннÑе, на лÑбой домен, безопаÑно и поÑÑи без лиÑнего ÑеÑевого ÑÑаÑика.
ÐÑÐ¸Ð¼ÐµÑ Ð±ÑаÑзеÑного кода
ÐÐ»Ñ Ð¾ÑкÑÑÑÐ¸Ñ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑаÑоÑно ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ WebSocket, Ñказав в нÑм ÑпеÑиалÑнÑй пÑоÑокол ws.:
var socket = new WebSocket("ws://javascript.ru/ws");
У обÑекÑа socket еÑÑÑ ÑеÑÑÑе колбÑка: один пÑи полÑÑении даннÑÑ
и ÑÑи â пÑи изменениÑÑ
в ÑоÑÑоÑнии ÑоединениÑ:
socket.onopen = function() {
alert("Соединение ÑÑÑановлено.");
};
socket.onclose = function(event) {
if (event.wasClean) {
alert('Соединение закÑÑÑо ÑиÑÑо');
} else {
alert('ÐбÑÑв ÑоединениÑ'); // напÑимеÑ, "ÑбиÑ" пÑоÑеÑÑ ÑеÑвеÑа
}
alert('Ðод: ' + event.code + ' пÑиÑина: ' + event.reason);
};
socket.onmessage = function(event) {
alert("ÐолÑÑÐµÐ½Ñ Ð´Ð°Ð½Ð½Ñе " + event.data);
};
socket.onerror = function(error) {
alert("ÐÑибка " + error.message);
};
ÐÐ»Ñ Ð¿Ð¾ÑÑлки даннÑÑ
иÑполÑзÑеÑÑÑ Ð¼ÐµÑод socket.send(data). ÐеÑеÑÑлаÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ лÑбÑе даннÑе.
ÐапÑимеÑ, ÑÑÑокÑ:
socket.send("ÐÑивеÑ");
â¦Ðли Ñайл, вÑбÑаннÑй в ÑоÑме:
socket.send(form.elements[0].file);
ÐÑоÑÑо, не пÑавда ли? ÐÑбиÑаем, ÑÑо пеÑеÑлаÑÑ, и socket.send().
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÐºÐ¾Ð¼Ð¼ÑникаÑÐ¸Ñ Ð±Ñла ÑÑпеÑной, ÑеÑÐ²ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ поддеÑживаÑÑ Ð¿ÑоÑокол WebSocket.
ЧÑÐ¾Ð±Ñ Ð»ÑÑÑе понимаÑÑ Ð¿ÑоиÑÑ Ð¾Ð´ÑÑее â поÑмоÑÑим, как он ÑÑÑÑоен.
УÑÑановление WebSocket-ÑоединениÑ
ÐÑоÑокол WebSocket ÑабоÑÐ°ÐµÑ Ð½Ð°Ð´ TCP.
ÐÑо ознаÑаеÑ, ÑÑо пÑи Ñоединении бÑаÑÐ·ÐµÑ Ð¾ÑпÑавлÑÐµÑ Ð¿Ð¾ HTTP ÑпеÑиалÑнÑе заголовки, ÑпÑаÑиваÑ: «поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð»Ð¸ ÑеÑÐ²ÐµÑ WebSocket?».
ÐÑли ÑеÑÐ²ÐµÑ Ð² оÑвеÑнÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ°Ñ Ð¾ÑвеÑÐ°ÐµÑ Â«Ð´Ð°, поддеÑживаÑ», Ñо далÑÑе HTTP пÑекÑаÑаеÑÑÑ Ð¸ обÑение идÑÑ Ð½Ð° ÑпеÑиалÑном пÑоÑоколе WebSocket, коÑоÑÑй Ñже не Ð¸Ð¼ÐµÐµÑ Ñ HTTP ниÑего обÑего.
УÑÑановление ÑоединениÑ
ÐÑÐ¸Ð¼ÐµÑ Ð·Ð°Ð¿ÑоÑа Ð¾Ñ Ð±ÑаÑзеÑа пÑи Ñоздании нового обÑекÑа new WebSocket("ws://server.example.com/chat"):
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Origin: http://javascript.ru
Sec-WebSocket-Key: Iv8io/9s+lYFgZWcXczP8Q==
Sec-WebSocket-Version: 13
ÐпиÑÐ°Ð½Ð¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð²:
- GET, Host
- СÑандаÑÑнÑе HTTP-заголовки из URL запÑоÑа
- Upgrade, Connection
- УказÑваÑÑ, ÑÑо бÑаÑÐ·ÐµÑ Ñ Ð¾ÑÐµÑ Ð¿ÐµÑейÑи на websocket.
- Origin
- ÐÑоÑокол, домен и поÑÑ, оÑкÑда оÑпÑавлен запÑоÑ.
- Sec-WebSocket-Key
- СлÑÑайнÑй клÑÑ, коÑоÑÑй генеÑиÑÑеÑÑÑ Ð±ÑаÑзеÑом: 16 Ð±Ð°Ð¹Ñ Ð² кодиÑовке Base64.
- Sec-WebSocket-Version
- ÐеÑÑÐ¸Ñ Ð¿ÑоÑокола. ТекÑÑÐ°Ñ Ð²ÐµÑÑиÑ: 13.
ÐÑе заголовки, кÑоме GET и Host, бÑаÑÐ·ÐµÑ Ð³ÐµÐ½ÐµÑиÑÑÐµÑ Ñам, без возможноÑÑи вмеÑаÑелÑÑÑва JavaScript.
СоздаÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñй XMLHttpRequest-запÑÐ¾Ñ (подделаÑÑ WebSocket) невозможно, по одной пÑоÑÑой пÑиÑине: ÑказаннÑе вÑÑе заголовки запÑеÑÐµÐ½Ñ Ðº ÑÑÑановке меÑодом setRequestHeader.
СеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоанализиÑоваÑÑ ÑÑи заголовки и ÑеÑиÑÑ, ÑазÑеÑÐ°ÐµÑ Ð»Ð¸ он WebSocket Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ домена Origin.
ÐÑÐ²ÐµÑ ÑеÑвеÑа, еÑли он Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÐµÑ Ð¸ ÑазÑеÑÐ°ÐµÑ WebSocket-подклÑÑение:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g=
ÐдеÑÑ ÑÑÑока Sec-WebSocket-Accept пÑедÑÑавлÑÐµÑ Ñобой пеÑекодиÑованнÑй по ÑпеÑиалÑÐ½Ð¾Ð¼Ñ Ð°Ð»Ð³Ð¾ÑиÑÐ¼Ñ ÐºÐ»ÑÑ Sec-WebSocket-Key. ÐÑаÑÐ·ÐµÑ Ð¸ÑполÑзÑÐµÑ ÐµÑ Ð´Ð»Ñ Ð¿ÑовеÑки, ÑÑо оÑÐ²ÐµÑ Ð¿ÑедназнаÑаеÑÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ емÑ.
ÐаÑем даннÑе пеÑедаÑÑÑÑ Ð¿Ð¾ ÑпеÑиалÑÐ½Ð¾Ð¼Ñ Ð¿ÑоÑоколÑ, ÑÑÑÑкÑÑÑа коÑоÑого («ÑÑеймÑ») изложена далее. Ð ÑÑо Ñже ÑовÑем не HTTP.
РаÑÑиÑÐµÐ½Ð¸Ñ Ð¸ подпÑоÑоколÑ
Также Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе заголовки Sec-WebSocket-Extensions и Sec-WebSocket-Protocol, опиÑÑваÑÑие ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¸ подпÑоÑÐ¾ÐºÐ¾Ð»Ñ (subprotocol), коÑоÑÑе поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñй клиенÑ.
ÐоÑмоÑÑим ÑазниÑÑ Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ на двÑÑ Ð¿ÑимеÑÐ°Ñ :
-
Ðаголовок
Sec-WebSocket-Extensions: deflate-frameознаÑаеÑ, ÑÑо бÑаÑÐ·ÐµÑ Ð¿Ð¾Ð´Ð´ÐµÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¼Ð¾Ð´Ð¸ÑикаÑÐ¸Ñ Ð¿ÑоÑокола, обеÑпеÑиваÑÑÑÑ ÑжаÑие даннÑÑ .ÐÑо говоÑÐ¸Ñ Ð½Ðµ о ÑÐ°Ð¼Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ , а об ÑлÑÑÑении ÑпоÑоба Ð¸Ñ Ð¿ÐµÑедаÑи. ÐÑаÑÐ·ÐµÑ Ñам ÑоÑмиÑÑÐµÑ ÑÑÐ¾Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº.
-
Ðаголовок
Sec-WebSocket-Protocol: soap, wampговоÑÐ¸Ñ Ð¾ Ñом, ÑÑо по WebSocket бÑаÑÐ·ÐµÑ ÑобиÑаеÑÑÑ Ð¿ÐµÑедаваÑÑ Ð½Ðµ пÑоÑÑо какие-Ñо даннÑе, а даннÑе в пÑоÑÐ¾ÐºÐ¾Ð»Ð°Ñ SOAP или WAMP («The WebSocket Application Messaging Protocol»). СÑандаÑÑнÑе подпÑоÑÐ¾ÐºÐ¾Ð»Ñ ÑегиÑÑÑиÑÑÑÑÑÑ Ð² ÑпеÑиалÑном каÑалоге IANA.ÐÑÐ¾Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº бÑаÑÐ·ÐµÑ Ð¿Ð¾ÑÑавиÑ, еÑли ÑказаÑÑ Ð²ÑоÑой необÑзаÑелÑнÑй паÑамеÑÑ
WebSocket:var socket = new WebSocket("ws://javascript.ru/ws", ["soap", "wamp"]);
ÐÑи налиÑии ÑÐ°ÐºÐ¸Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¾Ð² ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑ ÑаÑÑиÑÐµÐ½Ð¸Ñ Ð¸ подпÑоÑоколÑ, коÑоÑÑе он поддеÑживаеÑ, и оÑвеÑиÑÑ Ñ Ð½Ð¸Ð¼Ð¸.
ÐапÑимеÑ, запÑоÑ:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Origin: http://javascript.ru
Sec-WebSocket-Key: Iv8io/9s+lYFgZWcXczP8Q==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: deflate-frame
Sec-WebSocket-Protocol: soap, wamp
ÐÑвеÑ:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g=
Sec-WebSocket-Extensions: deflate-frame
Sec-WebSocket-Protocol: soap
РоÑвеÑе вÑÑе ÑеÑÐ²ÐµÑ ÑказÑваеÑ, ÑÑо поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑаÑÑиÑение deflate-frame, а из запÑоÑеннÑÑ
подпÑоÑоколов â ÑолÑко SOAP.
WSS
Соединение WebSocket можно оÑкÑÑваÑÑ ÐºÐ°Ðº WS:// или как WSS://. ÐÑоÑокол WSS пÑедÑÑавлÑÐµÑ Ñобой WebSocket над HTTPS.
ÐÑоме болÑÑей безопаÑноÑÑи, Ñ WSS еÑÑÑ Ð²Ð°Ð¶Ð½Ð¾Ðµ пÑеимÑÑеÑÑво пеÑед обÑÑнÑм WS â болÑÑÐ°Ñ Ð²ÐµÑоÑÑноÑÑÑ ÑоединениÑ.
Ðело в Ñом, ÑÑо HTTPS ÑиÑÑÑÐµÑ ÑÑаÑик Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñа к ÑеÑвеÑÑ, а HTTP â неÑ.
ÐÑли Ð¼ÐµÐ¶Ð´Ñ ÐºÐ»Ð¸ÐµÐ½Ñом и ÑеÑвеÑом еÑÑÑ Ð¿ÑокÑи, Ñо в ÑлÑÑае Ñ HTTP вÑе WebSocket-заголовки и даннÑе пеÑедаÑÑÑÑ ÑеÑез него. ÐÑокÑи Ð¸Ð¼ÐµÐµÑ Ðº ним доÑÑÑп, Ð²ÐµÐ´Ñ Ð¾Ð½Ð¸ никак не ÑиÑÑÑÑÑÑÑ, и Ð¼Ð¾Ð¶ÐµÑ ÑаÑÑениÑÑ Ð¿ÑоиÑÑ Ð¾Ð´ÑÑее как наÑÑÑение пÑоÑокола HTTP, обÑезаÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ или обоÑваÑÑ Ð¿ÐµÑедаÑÑ.
Рв ÑлÑÑае Ñ WSS веÑÑ ÑÑаÑик ÑÑÐ°Ð·Ñ ÐºÐ¾Ð´Ð¸ÑÑеÑÑÑ Ð¸ ÑеÑез пÑокÑи пÑоÑ
Ð¾Ð´Ð¸Ñ Ñже в закодиÑованном виде. ÐоÑÑÐ¾Ð¼Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ гаÑанÑиÑованно пÑойдÑÑ, и обÑÐ°Ñ Ð²ÐµÑоÑÑноÑÑÑ ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑеÑез WSS вÑÑе, Ñем ÑеÑез WS.
ФоÑÐ¼Ð°Ñ Ð´Ð°Ð½Ð½ÑÑ
Ðолное опиÑание пÑоÑокола ÑодеÑжиÑÑÑ Ð² RFC 6455.
ÐдеÑÑ Ð¿ÑедÑÑавлено ÑаÑÑиÑное опиÑание Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½ÑаÑиÑми ÑамÑÑ Ð²Ð°Ð¶Ð½ÑÑ ÐµÐ³Ð¾ ÑаÑÑей. ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе понÑÑÑ ÑÑандаÑÑ, Ñо ÑекомендÑеÑÑÑ ÑнаÑала пÑоÑиÑаÑÑ ÑÑо опиÑание.
ÐпиÑание ÑÑейма
РпÑоÑоколе WebSocket пÑедÑÑмоÑÑÐµÐ½Ñ Ð½ÐµÑколÑко видов пакеÑов («ÑÑеймов»).
Ðни делÑÑÑÑ Ð½Ð° два болÑÑÐ¸Ñ Ñипа: ÑÑÐµÐ¹Ð¼Ñ Ñ Ð´Ð°Ð½Ð½Ñми («data frames») и ÑпÑавлÑÑÑие («control frames»), пÑедназнаÑеннÑе Ð´Ð»Ñ Ð¿ÑовеÑки ÑвÑзи (PING) и закÑÑÑÐ¸Ñ ÑоединениÑ.
ФÑейм, ÑоглаÑно ÑÑандаÑÑÑ, вÑглÑÐ´Ð¸Ñ Ñак:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| опкод |Ð| Ðлина Ñела | РаÑÑиÑÐµÐ½Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Ñела |
|I|S|S|S|(4биÑа)|Ð| (7биÑ) | (1 байÑ) |
|N|V|V|V| |С| |(еÑли длина Ñела==126 или 127) |
| |1|2|3| |Ð| | |
| | | | | |Ð| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| ÐÑодолжение ÑаÑÑиÑенной Ð´Ð»Ð¸Ð½Ñ Ñела, еÑли длина Ñела = 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| | ÐлÑÑ Ð¼Ð°Ñки, еÑли ÐÐСÐÐ = 1 |
+-------------------------------+-------------------------------+
| ÐлÑÑ Ð¼Ð°Ñки (пÑодолжение) | ÐаннÑе ÑÑейма ("Ñело") |
+-------------------------------- - - - - - - - - - - - - - - - +
: ÐаннÑе пÑодолжаÑÑÑÑ ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| ÐаннÑе пÑодолжаÑÑÑÑ ... |
+---------------------------------------------------------------+
С Ð²Ð¸Ð´Ñ â не оÑÐµÐ½Ñ Ð¿Ð¾Ð½ÑÑно, во вÑÑком ÑлÑÑае, Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва лÑдей.
ÐозволÑÑе поÑÑниÑÑ: ÑиÑаÑÑ ÑледÑÐµÑ Ñлева-напÑаво, ÑвеÑÑ Ñ-вниз, ÐºÐ°Ð¶Ð´Ð°Ñ Ð³Ð¾ÑизонÑалÑÐ½Ð°Ñ Ð¿Ð¾Ð»Ð¾Ñка ÑÑо 32 биÑа.
То еÑÑÑ, Ð²Ð¾Ñ Ð¿ÐµÑвÑе 32 биÑа:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| опкод |Ð| Ðлина Ñела | РаÑÑиÑÐµÐ½Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Ñела |
|I|S|S|S|(4биÑа)|Ð| (7биÑ) | (1 байÑ) |
|N|V|V|V| |С| |(еÑли длина Ñела==126 или 127) |
| |1|2|3| |Ð| | |
| | | | | |Ð| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
СнаÑала идÑÑ Ð±Ð¸Ñ FIN (веÑÑикалÑÐ½Ð°Ñ Ð½Ð°Ð´Ð¿Ð¸ÑÑ Ð½Ð° ÑиÑÑнке), заÑем биÑÑ RSV1, RSV2, RSV3 (Ð¸Ñ ÑмÑÑл ÑаÑкÑÑÑ Ð½Ð¸Ð¶Ðµ), заÑем «опкод», «ÐÐСÐл и, наконеÑ, «Ðлина Ñела», коÑоÑÐ°Ñ Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ 7 биÑ. ÐаÑем, еÑли «Ðлина Ñела» Ñавна 126 или 127, идÑÑ Â«Ð Ð°ÑÑиÑÐµÐ½Ð½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° Ñела», поÑом (на ÑледÑÑÑей ÑÑÑоке, Ñо еÑÑÑ Ð¿Ð¾Ñле пеÑвÑÑ 32 биÑ) бÑÐ´ÐµÑ ÐµÑ Ð¿Ñодолжение, клÑÑ Ð¼Ð°Ñки, и поÑом даннÑе.
Ð ÑепеÑÑ â подÑобное опиÑание ÑаÑÑей ÑÑейма, Ñо еÑÑÑ ÐºÐ°Ðº именно пеÑедаÑÑÑÑ ÑообÑениÑ:
- FIN: 1 биÑ
-
Ðдно ÑообÑение, еÑли оно оÑÐµÐ½Ñ Ð´Ð»Ð¸Ð½Ð½Ð¾Ðµ (вÑзовом
sendможно пеÑедаÑÑ Ñ Ð¾ÑÑ ÑелÑй Ñайл), Ð¼Ð¾Ð¶ÐµÑ ÑоÑÑоÑÑÑ Ð¸Ð· множеÑÑва ÑÑеймов («бÑÑÑ ÑÑагменÑиÑованнÑм»).У вÑÐµÑ ÑÑеймов, кÑоме поÑледнего, ÑÑÐ¾Ñ ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ ÑÑÑановлен в
0, Ñ Ð¿Ð¾Ñледнего â в1.ÐÑли ÑообÑение ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· одного-единÑÑвенного ÑÑейма, Ñо
FINв нÑм Ñавен1. - RSV1, RSV2, RSV3: 1 Ð±Ð¸Ñ ÐºÐ°Ð¶Ð´Ñй
-
РобÑÑном WebSocket ÑавнÑ
0, пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ ÑаÑÑиÑений пÑоÑокола. РаÑÑиÑение Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¿Ð¸ÑаÑÑ Ð² ÑÑи биÑÑ Ñвои знаÑениÑ. - Ðпкод: 4 биÑа
-
ÐадаÑÑ Ñип ÑÑейма, коÑоÑÑй позволÑÐµÑ Ð¸Ð½ÑеÑпÑеÑиÑоваÑÑ Ð½Ð°Ñ Ð¾Ð´ÑÑиеÑÑ Ð² нÑм даннÑе. ÐозможнÑе знаÑениÑ:
0x1обознаÑÐ°ÐµÑ ÑекÑÑовÑй ÑÑейм.0x2обознаÑÐ°ÐµÑ Ð´Ð²Ð¾Ð¸ÑнÑй ÑÑейм.0x3-7заÑезеÑвиÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð±ÑдÑÑÐ¸Ñ ÑÑеймов Ñ Ð´Ð°Ð½Ð½Ñми.0x8обознаÑÐ°ÐµÑ Ð·Ð°ÐºÑÑÑие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑÑим ÑÑеймом.0x9обознаÑÐ°ÐµÑ PING.0xAобознаÑÐ°ÐµÑ PONG.0xB-FзаÑезеÑвиÑÐ¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð±ÑдÑÑÐ¸Ñ ÑпÑавлÑÑÑÐ¸Ñ ÑÑеймов.0x0обознаÑÐ°ÐµÑ ÑÑейм-пÑодолжение Ð´Ð»Ñ ÑÑагменÑиÑованного ÑообÑениÑ. Ðн инÑеÑпÑеÑиÑÑеÑÑÑ, иÑÑ Ð¾Ð´Ñ Ð¸Ð· ближайÑего пÑедÑдÑÑего ненÑлевого Ñипа.
- ÐаÑка: 1 биÑ
-
ÐÑли ÑÑÐ¾Ñ Ð±Ð¸Ñ ÑÑÑановлен, Ñо даннÑе ÑÑейма маÑкиÑованÑ. Ðолее подÑобно маÑÐºÑ Ð¸ маÑкиÑование Ð¼Ñ ÑаÑÑмоÑÑим далее.
- Ðлина Ñела: 7 биÑов, 7+16 биÑов, или 7+64 биÑов
-
ÐÑли знаÑение поле «Ðлина Ñела» Ð»ÐµÐ¶Ð¸Ñ Ð² инÑеÑвале
0-125, Ñо оно обознаÑÐ°ÐµÑ Ð´Ð»Ð¸Ð½Ñ Ñела (иÑполÑзÑеÑÑÑ Ð´Ð°Ð»ÐµÐµ). ÐÑли126, Ñо ÑледÑÑÑие 2 байÑа инÑеÑпÑеÑиÑÑÑÑÑÑ ÐºÐ°Ðº 16-биÑное беззнаковое Ñелое ÑиÑло, ÑодеÑжаÑее Ð´Ð»Ð¸Ð½Ñ Ñела. ÐÑли127, Ñо ÑледÑÑÑие 8 Ð±Ð°Ð¹Ñ Ð¸Ð½ÑеÑпÑеÑиÑÑÑÑÑÑ ÐºÐ°Ðº 64-биÑное беззнаковое Ñелое, ÑодеÑжаÑее длинÑ.Ð¢Ð°ÐºÐ°Ñ Ñ Ð¸ÑÑÐ°Ñ ÑÑ ÐµÐ¼Ð° нÑжна, ÑÑÐ¾Ð±Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð¸Ð·Ð¸ÑоваÑÑ Ð½Ð°ÐºÐ»Ð°Ð´Ð½Ñе ÑаÑÑ Ð¾Ð´Ñ. ÐÐ»Ñ ÑообÑений длиной
125Ð±Ð°Ð¹Ñ Ð¸ менÑÑе Ñ Ñанение Ð´Ð»Ð¸Ð½Ñ Ð¿Ð¾ÑÑебÑÐµÑ Ð²Ñего 7 биÑов, Ð´Ð»Ñ Ð±Ã³Ð»ÑÑÐ¸Ñ (до 65536) â 7 биÑов + 2 байÑа, Ð½Ñ Ð° Ð´Ð»Ñ ÐµÑÑ Ð±Ã³Ð»ÑÑÐ¸Ñ â 7 биÑов и 8 байÑ. ÐÑого Ñ Ð²Ð°ÑÐ¸Ñ Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð»Ð¸Ð½Ñ ÑообÑÐµÐ½Ð¸Ñ ÑазмеÑом в Ð³Ð¸Ð³Ð°Ð±Ð°Ð¹Ñ Ð¸ более. - ÐлÑÑ Ð¼Ð°Ñки: 4 байÑа.
-
ÐÑли биÑ
ÐаÑкаÑÑÑановлен в 0, Ñо ÑÑого Ð¿Ð¾Ð»Ñ Ð½ÐµÑ. ÐÑли в1Ñо ÑÑи байÑÑ ÑодеÑÐ¶Ð°Ñ Ð¼Ð°ÑкÑ, коÑоÑÐ°Ñ Ð½Ð°Ð»Ð°Ð³Ð°ÐµÑÑÑ Ð½Ð° Ñело (Ñм. далее). - ÐаннÑе ÑÑейма (Ñело)
-
СоÑÑÐ¾Ð¸Ñ Ð¸Ð· «даннÑÑ ÑаÑÑиÑений» и «даннÑÑ Ð¿ÑиложениÑ», коÑоÑÑе идÑÑ Ð·Ð° ними. ÐаннÑе ÑаÑÑиÑений опÑеделÑÑÑÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑми ÑаÑÑиÑениÑми пÑоÑокола и по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾ÑÑÑÑÑÑвÑÑÑ. Ðлина Ñела должна бÑÑÑ Ñавна Ñказанной в заголовке.
ÐÑимеÑÑ
ÐекоÑоÑÑе пÑимеÑÑ ÑообÑений:
-
ÐеÑÑагменÑиÑованное ÑекÑÑовое ÑообÑение
Helloбез маÑки:0x81 0x05 0x48 0x65 0x6c 0x6c 0x6f (ÑодеÑÐ¶Ð¸Ñ "Hello")Рзаголовке пеÑвÑй Ð±Ð°Ð¹Ñ ÑодеÑжиÑ
FIN=1иопкод=0x1(полÑÑаеÑÑÑ10000001в двоиÑной ÑиÑÑеме, Ñо еÑÑÑ0x81â в 16-ÑиÑной), далее идÑÑ Ð´Ð»Ð¸Ð½Ð°0x5, далее ÑекÑÑ. -
ФÑагменÑиÑованное ÑекÑÑовое ÑообÑение
Hello Worldиз ÑÑÑÑ ÑаÑÑей, без маÑки, Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ Ñак:0x01 0x05 0x48 0x65 0x6c 0x6c 0x6f (ÑодеÑÐ¶Ð¸Ñ "Hello") 0x00 0x01 0x20 (ÑодеÑÐ¶Ð¸Ñ " ") 0x80 0x05 0x57 0x6f 0x72 0x6c 0x64 (ÑодеÑÐ¶Ð¸Ñ "World")- У пеÑвого ÑÑейма
FIN=0и ÑекÑÑовÑй опкод0x1. - У вÑоÑого
FIN=0и опкод0x0. ÐÑи ÑÑагменÑаÑии ÑообÑениÑ, Ñ Ð²ÑÐµÑ ÑÑеймов, кÑоме пеÑвого, опкод пÑÑÑой (он один на вÑÑ ÑообÑение). - У ÑÑеÑÑего, поÑледнего ÑÑейма
FIN=1.
- У пеÑвого ÑÑейма
Ð ÑепеÑÑ Ð¿Ð¾ÑмоÑÑим на вÑе Ñе замеÑаÑелÑнÑе возможноÑÑи, коÑоÑÑе даÑÑ ÑÑÐ¾Ñ ÑоÑÐ¼Ð°Ñ ÑÑейма.
ФÑагменÑаÑиÑ
ÐозволÑÐµÑ Ð¾ÑпÑавлÑÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð² ÑÐµÑ ÑлÑÑаÑÑ , когда на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ñала поÑÑлки полнÑй ÑÐ°Ð·Ð¼ÐµÑ ÐµÑÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑен.
ÐапÑимеÑ, идÑÑ Ð¿Ð¾Ð¸Ñк в базе даннÑÑ Ð¸ ÑÑо-Ñо Ñже найдено, а ÑÑо-Ñо еÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð·Ð¶Ðµ.
- У вÑеÑ
ÑообÑений, кÑоме поÑледнего, биÑ
FIN=0. - Ðпкод ÑказÑваеÑÑÑ ÑолÑко Ñ Ð¿ÐµÑвого, Ñ Ð¾ÑÑалÑнÑÑ
он должен бÑÑÑ Ñавен
0x0.
PING / PONG
РпÑоÑокол вÑÑÑоена пÑовеÑка ÑвÑзи пÑи помоÑи ÑпÑавлÑÑÑÐ¸Ñ ÑÑеймов Ñипа PING и PONG.
ТоÑ, кÑо Ñ Ð¾ÑÐµÑ Ð¿ÑовеÑиÑÑ Ñоединение, оÑпÑавлÑÐµÑ ÑÑейм PING Ñ Ð¿ÑоизволÑнÑм Ñелом. Ðго полÑÑаÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ в ÑазÑмное вÑÐµÐ¼Ñ Ð¾ÑвеÑиÑÑ ÑÑеймом PONG Ñ Ñем же Ñелом.
ÐÑа ÑÑнкÑионалÑноÑÑÑ Ð²ÑÑÑоена в бÑаÑзеÑнÑÑ ÑеализаÑиÑ, Ñак ÑÑо бÑаÑÐ·ÐµÑ Ð¾ÑвеÑÐ¸Ñ Ð½Ð° PING ÑеÑвеÑа, но ÑпÑавлÑÑÑ ÐµÐ¹ из JavaScript нелÑзÑ.
ÐнаÑе говоÑÑ, ÑеÑÐ²ÐµÑ Ð²Ñегда знаеÑ, жив ли поÑеÑиÑÐµÐ»Ñ Ð¸Ð»Ð¸ Ñ Ð½ÐµÐ³Ð¾ пÑоблема Ñ ÑеÑÑÑ.
ЧиÑÑое закÑÑÑие
ÐÑи закÑÑÑии ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑÑоÑона, желаÑÑÐ°Ñ ÑÑо ÑделаÑÑ (обе ÑÑоÑÐ¾Ð½Ñ Ð² WebSocket ÑавнопÑавнÑ) оÑпÑавлÑÐµÑ Ð·Ð°ÐºÑÑваÑÑий ÑÑейм (опкод 0x8), в Ñеле коÑоÑого ÑказÑÐ²Ð°ÐµÑ Ð¿ÑиÑÐ¸Ð½Ñ Ð·Ð°ÐºÑÑÑиÑ.
РбÑаÑзеÑной ÑеализаÑии ÑÑа пÑиÑина бÑÐ´ÐµÑ ÑодеÑжаÑÑÑÑ Ð² ÑвойÑÑве reason ÑобÑÑÐ¸Ñ onclose.
ÐалиÑие Ñакого ÑÑейма позволÑÐµÑ Ð¾ÑлиÑиÑÑ Â«ÑиÑÑое закÑÑÑие» Ð¾Ñ Ð¾Ð±ÑÑва ÑвÑзи.
РбÑаÑзеÑной ÑеализаÑии ÑобÑÑие onclose пÑи ÑиÑÑом закÑÑÑии Ð¸Ð¼ÐµÐµÑ event.wasClean = true.
ÐÐ¾Ð´Ñ Ð·Ð°ÐºÑÑÑиÑ
ÐÐ¾Ð´Ñ Ð·Ð°ÐºÑÑÑÐ¸Ñ Ð²ÐµÐ±ÑокеÑа event.code, ÑÑÐ¾Ð±Ñ Ð½Ðµ пÑÑаÑÑ Ð¸Ñ
Ñ HTTP-кодами, ÑоÑÑоÑÑ Ð¸Ð· 4 ÑиÑÑ:
1000- ÐоÑмалÑное закÑÑÑие.
1001- УдалÑÐ½Ð½Ð°Ñ ÑÑоÑона «иÑÑезла». ÐапÑимеÑ, пÑоÑеÑÑ ÑеÑвеÑа ÑÐ±Ð¸Ñ Ð¸Ð»Ð¸ бÑаÑÐ·ÐµÑ Ð¿ÐµÑеÑÑл на дÑÑгÑÑ ÑÑÑаниÑÑ.
1002- УдалÑÐ½Ð½Ð°Ñ ÑÑоÑона завеÑÑила Ñоединение в ÑвÑзи Ñ Ð¾Ñибкой пÑоÑокола.
1003- УдалÑÐ½Ð½Ð°Ñ ÑÑоÑона завеÑÑила Ñоединение в ÑвÑзи Ñ Ñем, ÑÑо она полÑÑила даннÑе, коÑоÑÑе не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑинÑÑÑ. ÐапÑимеÑ, ÑÑоÑона, коÑоÑÐ°Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÐµÑ ÑолÑко ÑекÑÑовÑе даннÑе, Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÐºÑÑÑÑ Ñоединение Ñ Ñаким кодом, еÑли пÑинÑла бинаÑное ÑообÑение.
ÐÑака «оÑÑавленнÑй кÑÑ»
Ð ÑÐ°Ð½Ð½Ð¸Ñ ÑеализаÑиÑÑ WebSocket ÑÑÑеÑÑвовала ÑÑзвимоÑÑÑ, назÑÐ²Ð°ÐµÐ¼Ð°Ñ Â«Ð¾ÑÑавленнÑй кÑÑ» (cache poisoning).
Ðна позволÑла аÑаковаÑÑ ÐºÑÑиÑÑÑÑие пÑокÑи-ÑеÑвеÑа, в ÑаÑÑноÑÑи, коÑпоÑаÑивнÑе.
ÐÑака оÑÑÑеÑÑвлÑлаÑÑ Ñак:
-
Ð¥Ð°ÐºÐµÑ Ð·Ð°Ð¼Ð°Ð½Ð¸Ð²Ð°ÐµÑ Ð´Ð¾Ð²ÐµÑÑивого поÑеÑиÑÐµÐ»Ñ (далее ÐеÑÑва) на ÑÐ²Ð¾Ñ ÑÑÑаниÑÑ.
-
СÑÑаниÑа оÑкÑÑваеÑ
WebSocket-Ñоединение на ÑÐ°Ð¹Ñ Ñ Ð°ÐºÐµÑа. ÐÑедполагаеÑÑÑ, ÑÑо ÐеÑÑва ÑÐ¸Ð´Ð¸Ñ ÑеÑез пÑокÑи. СобÑÑвенно, на пÑокÑи и напÑавлена ÑÑа аÑака. -
СÑÑаниÑа ÑоÑмиÑÑÐµÑ ÑпеÑиалÑного вида WebSocket-запÑоÑ, коÑоÑÑй (и здеÑÑ Ñамое главное!) ÑÑд пÑокÑи ÑеÑвеÑов не понимаÑÑ.
Ðни пÑопÑÑкаÑÑ Ð½Ð°ÑалÑнÑй запÑÐ¾Ñ ÑеÑез ÑÐµÐ±Ñ (коÑоÑÑй ÑодеÑжиÑ
Connection: upgrade) и дÑмаÑÑ, ÑÑо далее идÑÑ Ñже ÑледÑÑÑий HTTP-запÑоÑ.â¦Ðо на Ñамом деле Ñам даннÑе, идÑÑие ÑеÑез вебÑокеÑ! Робе ÑÑоÑÐ¾Ð½Ñ Ð²ÐµÐ±ÑокеÑа (ÑÑÑаниÑа и ÑеÑвеÑ) конÑÑолиÑÑÑÑÑÑ Ð¥Ð°ÐºÐµÑом. Так ÑÑо Ñ Ð°ÐºÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÐµÑедаÑÑ Ð² Ð½Ð¸Ñ Ð½ÐµÑÑо Ð¿Ð¾Ñ Ð¾Ð¶ÐµÐµ на GET-запÑÐ¾Ñ Ðº извеÑÑÐ½Ð¾Ð¼Ñ ÑеÑÑÑÑÑ, напÑимеÑ
http://code.jquery.com/jquery.js, а ÑеÑÐ²ÐµÑ Ð¾ÑвеÑÐ¸Ñ Â«ÑÐºÐ¾Ð±Ñ ÐºÐ¾Ð´Ð¾Ð¼ jQuery» Ñ ÐºÑÑиÑÑÑÑими заголовками.ÐÑокÑи поÑлÑÑно пÑоглоÑÐ¸Ñ ÑÑÐ¾Ñ Ð¾ÑÐ²ÐµÑ Ð¸ закÑÑиÑÑÐµÑ Â«ÑÐºÐ¾Ð±Ñ jQuery».
-
Ð ÑезÑлÑÑаÑе пÑи загÑÑзке поÑледÑÑÑÐ¸Ñ ÑÑÑÐ°Ð½Ð¸Ñ Ð»Ñбой полÑзоваÑелÑ, иÑполÑзÑÑÑий ÑÐ¾Ñ Ð¶Ðµ пÑокÑи, ÑÑо и ÐеÑÑва, полÑÑÐ¸Ñ Ð²Ð¼ÐµÑÑо
http://code.jquery.com/jquery.jsÑ Ð°ÐºÐµÑÑкий код.
ÐоÑÑÐ¾Ð¼Ñ ÑÑа аÑака и назÑваеÑÑÑ Â«Ð¾ÑÑавленнÑй кÑÑ».
Ð¢Ð°ÐºÐ°Ñ Ð°Ñака возможна не Ð´Ð»Ñ Ð»ÑбÑÑ Ð¿ÑокÑи, но пÑи анализе ÑÑзвимоÑÑи бÑло показано, ÑÑо она не ÑеоÑеÑиÑеÑкаÑ, и ÑÑзвимÑе пÑокÑи дейÑÑвиÑелÑно еÑÑÑ.
ÐоÑÑÐ¾Ð¼Ñ Ð¿ÑидÑмали ÑпоÑоб заÑиÑÑ â «маÑкÑ».
ÐаÑка Ð´Ð»Ñ Ð·Ð°ÑиÑÑ Ð¾Ñ Ð°Ñаки
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð·Ð°ÑиÑиÑÑÑÑ Ð¾Ñ Ð°Ñаки, и пÑидÑмана маÑка.
ÐлÑÑ Ð¼Ð°Ñки â ÑÑо ÑлÑÑайное 32-биÑное знаÑение, коÑоÑое ваÑÑиÑÑеÑÑÑ Ð¾Ñ Ð¿Ð°ÐºÐµÑа к пакеÑÑ. Тело ÑообÑÐµÐ½Ð¸Ñ Ð¿ÑоÑ
Ð¾Ð´Ð¸Ñ ÑеÑез XOR ^ Ñ Ð¼Ð°Ñкой, а полÑÑаÑÐµÐ»Ñ Ð²Ð¾ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ ÐµÐ³Ð¾ повÑоÑнÑм XOR Ñ Ð½ÐµÐ¹ (можно легко доказаÑÑ, ÑÑо (x ^ a) ^ a == x).
ÐаÑка ÑлÑÐ¶Ð¸Ñ Ð´Ð²Ñм ÑелÑм:
- Ðна генеÑиÑÑеÑÑÑ Ð±ÑаÑзеÑом. ÐоÑÑÐ¾Ð¼Ñ ÑепеÑÑ Ñ Ð°ÐºÐµÑ Ð½Ðµ ÑÐ¼Ð¾Ð¶ÐµÑ ÑпÑавлÑÑÑ ÑеалÑнÑм ÑодеÑжанием Ñела ÑообÑениÑ. ÐоÑле накладÑÐ²Ð°Ð½Ð¸Ñ Ð¼Ð°Ñки оно пÑевÑаÑиÑÑÑ Ð² бинаÑнÑÑ Ð¼ÐµÑанинÑ.
- ÐолÑÑивÑийÑÑ Ð¿Ð°ÐºÐµÑ Ð´Ð°Ð½Ð½ÑÑ Ñже ÑоÑно не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ð¾ÑпÑинÑÑ Ð¿ÑомежÑÑоÑнÑм пÑокÑи как HTTP-запÑоÑ.
Ðаложение маÑки ÑÑебÑÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ ÑеÑÑÑÑов, поÑÑÐ¾Ð¼Ñ Ð¿ÑоÑокол WebSocket не ÑÑебÑÐµÑ ÐµÑ.
ÐÑли по ÑÑÐ¾Ð¼Ñ Ð¿ÑоÑÐ¾ÐºÐ¾Ð»Ñ ÑвÑзÑваÑÑÑÑ Ð´Ð²Ð° клиенÑа (не обÑзаÑелÑно бÑаÑзеÑÑ), довеÑÑÑÑие дÑÑг дÑÑÐ³Ñ Ð¸ поÑÑедникам, Ñо можно поÑÑавиÑÑ Ð±Ð¸Ñ ÐаÑка в 0, и Ñогда клÑÑ Ð¼Ð°Ñки не ÑказÑваеÑÑÑ.
ÐÑимеÑ
РаÑÑмоÑÑим пÑоÑоÑип ÑаÑа на WebSocket и Node.JS.
HTML: поÑеÑиÑÐµÐ»Ñ Ð¾ÑÑÑÐ»Ð°ÐµÑ ÑообÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑоÑÐ¼Ñ Ð¸ пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð² div
<!-- ÑоÑма Ð´Ð»Ñ Ð¾ÑпÑавки ÑообÑений -->
<form name="publish">
<input type="text" name="message">
<input type="submit" value="ÐÑпÑавиÑÑ">
</form>
<!-- здеÑÑ Ð±ÑдÑÑ Ð¿Ð¾ÑвлÑÑÑÑÑ Ð²Ñ
одÑÑие ÑообÑÐµÐ½Ð¸Ñ -->
<div id="subscribe"></div>
Ðод на клиенÑе:
// ÑоздаÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение
var socket = new WebSocket("ws://localhost:8081");
// оÑпÑавиÑÑ ÑообÑение из ÑоÑÐ¼Ñ publish
document.forms.publish.onsubmit = function() {
var outgoingMessage = this.message.value;
socket.send(outgoingMessage);
return false;
};
// обÑабоÑÑик вÑ
одÑÑиÑ
ÑообÑений
socket.onmessage = function(event) {
var incomingMessage = event.data;
showMessage(incomingMessage);
};
// показаÑÑ ÑообÑение в div#subscribe
function showMessage(message) {
var messageElem = document.createElement('div');
messageElem.appendChild(document.createTextNode(message));
document.getElementById('subscribe').appendChild(messageElem);
}
СеÑвеÑнÑй код можно пиÑаÑÑ Ð½Ð° лÑбой плаÑÑоÑме. РнаÑем ÑлÑÑае ÑÑо бÑÐ´ÐµÑ Node.JS, Ñ Ð¸ÑполÑзованием модÑÐ»Ñ ws:
var WebSocketServer = new require('ws');
// подклÑÑÑннÑе клиенÑÑ
var clients = {};
// WebSocket-ÑеÑÐ²ÐµÑ Ð½Ð° поÑÑÑ 8081
var webSocketServer = new WebSocketServer.Server({
port: 8081
});
webSocketServer.on('connection', function(ws) {
var id = Math.random();
clients[id] = ws;
console.log("новое Ñоединение " + id);
ws.on('message', function(message) {
console.log('полÑÑено ÑообÑение ' + message);
for (var key in clients) {
clients[key].send(message);
}
});
ws.on('close', function() {
console.log('Ñоединение закÑÑÑо ' + id);
delete clients[id];
});
});
РабоÑий пÑÐ¸Ð¼ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑкаÑаÑÑ: websocket.zip. ÐонадобиÑÑÑ Ð¿Ð¾ÑÑавиÑÑ Ð´Ð²Ð° модÑлÑ: npm install node-static && npm install ws.
ÐÑого
WebSocket â ÑовÑеменное ÑÑедÑÑво коммÑникаÑии. ÐÑоÑÑ-доменное, ÑнивеÑÑалÑное, безопаÑное.
Ðа ÑекÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¾Ð½ ÑабоÑÐ°ÐµÑ Ð² бÑаÑзеÑÐ°Ñ IE10+, FF11+, Chrome 16+, Safari 6+, Opera 12.5+. Рболее ÑÑаÑÑÑ Ð²ÐµÑÑиÑÑ FF, Chrome, Safari, Opera еÑÑÑ Ð¿Ð¾Ð´Ð´ÐµÑжка ÑеÑновÑÑ ÑедакÑий пÑоÑокола.
Там, где вебÑокеÑÑ Ð½Ðµ ÑабоÑаÑÑ â обÑÑно иÑполÑзÑÑÑ Ð´ÑÑгие ÑÑанÑпоÑÑÑ, напÑÐ¸Ð¼ÐµÑ IFRAME. ÐÑ Ð½Ð°Ð¹Ð´ÑÑе иÑ
в дÑÑгиÑ
ÑÑаÑÑÑÑ
ÑÑого Ñаздела.
ÐÑÑÑ Ð¸ гоÑовÑе библиоÑеки, ÑеализÑÑÑие ÑÑнкÑионалÑноÑÑÑ COMET Ñ Ð¸ÑполÑзованием ÑÑÐ°Ð·Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑанÑпоÑÑов, из коÑоÑÑÑ Ð²ÐµÐ±ÑÐ¾ÐºÐµÑ Ð¸Ð¼ÐµÐµÑ Ð¿ÑиоÑиÑеÑ. Ðак пÑавило, библиоÑеки ÑоÑÑоÑÑ Ð¸Ð· двÑÑ ÑаÑÑей: клиенÑÑкой и ÑеÑвеÑной.
ÐапÑимеÑ, Ð´Ð»Ñ Node.JS одной из ÑамÑÑ Ð¸Ð·Ð²ÐµÑÑнÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñек ÑвлÑеÑÑÑ Socket.IO.
РнедоÑÑаÑкам библиоÑек ÑледÑÐµÑ Ð¾ÑнеÑÑи Ñо, ÑÑо некоÑоÑÑе пÑодвинÑÑÑе возможноÑÑи WebSocket, Ñакие как двÑÑ ÑÑоÑонний обмен бинаÑнÑми даннÑми, в Ð½Ð¸Ñ Ð½ÐµÐ´Ð¾ÑÑÑпнÑ. С дÑÑгой â в болÑÑинÑÑве ÑлÑÑаев ÑÑандаÑÑного ÑекÑÑового обмена вполне доÑÑаÑоÑно.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)