Ðеб-ÑокеÑÑ - ÑÐµÑ Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ, коÑоÑÐ°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¾ÑкÑÑÑÑ Ð¸Ð½ÑеÑакÑивнÑÑ ÑеÑÑÐ¸Ñ Ð¾Ð±ÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð±ÑаÑзеÑом полÑзоваÑÐµÐ»Ñ Ð¸ ÑеÑвеÑом. СоединÑÑÑÑ ÑеÑез веб-ÑокеÑÑ, веб-пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¾ÑÑÑеÑÑвлÑÑÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвие в ÑеалÑном вÑемени вмеÑÑо Ñого, ÑÑÐ¾Ð±Ñ Ð´ÐµÐ»Ð°ÑÑ Ð·Ð°Ð¿ÑоÑÑ Ðº клиенÑÑ Ð¾ Ð²Ñ Ð¾Ð´ÑÑÐ¸Ñ /иÑÑ Ð¾Ð´ÑÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸ÑÑ .
ÐÑимеÑание: У Ð½Ð°Ñ ÐµÑÑÑ ÑабоÑаÑÑий пÑÐ¸Ð¼ÐµÑ ÑаÑа, ÑаÑÑи кода из коÑоÑого иÑполÑзÑÑÑÑÑ Ð² ÑÑаÑÑе. ÐÑÐ¸Ð¼ÐµÑ Ð±ÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпен, когда инÑÑаÑÑÑÑкÑÑÑа ÑайÑа ÑÐ¼Ð¾Ð¶ÐµÑ Ð´Ð¾Ð»Ð¶Ð½Ñм обÑазом поддеÑживаÑÑ Ñ Ð¾ÑÑинг пÑимеÑов Ñ Ð¸ÑполÑзованием веб-ÑокеÑов.
ÐоÑÑÑпноÑÑÑ Ð²ÐµÐ±-ÑокеÑовAPI веб-ÑокеÑов доÑÑÑпно в Javascript коде, облаÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи коÑоÑого вклÑÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ DOM Window
или лÑбой обÑекÑ, ÑеализÑÑÑий WorkerUtils
; ÑÑо ознаÑаеÑ, ÑÑо Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Web Workers.
ÐÑимеÑание: API веб-ÑокеÑов (как и пÑоÑокол лежаÑий в его оÑнове) вÑÑ ÐµÑÑ Ð¿ÑÐ¾Ñ Ð¾Ð´ÑÑ ÑÑап акÑивной ÑазÑабоÑки; в наÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð³Ð¾ пÑоблем ÑовмеÑÑимоÑÑи Ñ ÑазнÑми бÑаÑзеÑами (и даже Ñ ÑазнÑми Ñелизами одного и Ñого же бÑаÑзеÑа).
Создание обÑекÑа WebSocketЧÑÐ¾Ð±Ñ Ð¾Ð±ÑаÑÑÑÑ ÑеÑез пÑоÑокол веб-ÑокеÑов необÑ
одимо ÑоздаÑÑ Ð¾Ð±ÑÐµÐºÑ WebSocket
; пÑи его Ñоздании авÑомаÑиÑеÑки пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ð¾Ð¿ÑÑка оÑкÑÑÑÑ Ñоединение Ñ ÑеÑвеÑом.
ÐонÑÑÑÑкÑÐ¾Ñ WebSocket пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð´Ð¸Ð½ обÑзаÑелÑнÑй и один необÑзаÑелÑнÑй паÑамеÑÑ:
WebSocket WebSocket( in DOMString url, in optional DOMString protocols ); WebSocket WebSocket( in DOMString url, in optional DOMString[] protocols );
url
URL, Ñ ÐºÐ¾ÑоÑÑм пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ñоединение; ÑÑо должен бÑÑÑ URL веб-ÑокеÑ-ÑеÑвеÑа.
protocols
ÐеобÑзаÑелÑнÑй
ÐÐ¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð´Ð½Ð¾Ð¹ ÑÑÑокой пÑоÑокола или маÑÑивом ÑÐ°ÐºÐ¸Ñ ÑÑÑок. ÐÑи ÑÑÑоки иÑполÑзÑÑÑ Ð´Ð»Ñ Ð¸Ð½Ð´Ð¸ÐºÐ°Ñии под-пÑоÑоколов; Ñаким обÑазом, один ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ ÑеализовÑваÑÑ Ð½ÐµÑколÑко под-пÑоÑоколов веб-ÑокеÑов (к пÑимеÑÑ, вам Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ, ÑÑÐ¾Ð±Ñ ÑеÑÐ²ÐµÑ Ð¼Ð¾Ð³ обÑабаÑÑваÑÑ ÑазнÑе ÑÐ¸Ð¿Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвий в завиÑимоÑÑи Ð¾Ñ Ð¾Ð¿ÑеделÑнного под-пÑоÑокола). ÐÑли Ð²Ñ Ð½Ðµ ÑкажеÑе ÑÑÑÐ¾ÐºÑ Ð¿ÑоÑокола, Ñо бÑÐ´ÐµÑ Ð¿ÐµÑедана пÑÑÑÐ°Ñ ÑÑÑока.
РконÑÑÑÑкÑоÑе могÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑÑ ÑледÑÑÑие иÑклÑÑениÑ:
SECURITY_ERR
ÐоÑÑ, к коÑоÑÐ¾Ð¼Ñ Ð¿ÑоводиÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение, заблокиÑован.
ÐÑли оÑибка ÑлÑÑаеÑÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¿Ð¾Ð¿ÑÑки подклÑÑениÑ, Ñо в обÑÐµÐºÑ WebSocket
ÑнаÑала поÑÑлаеÑÑÑ Ð¿ÑоÑÑое ÑобÑÑие Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «error» (Ñаким обÑазом, задейÑÑвÑÑ Ð¾Ð±ÑабоÑÑик onerror
), поÑом - ÑобÑÑие CloseEvent
(Ñаким обÑазом, задейÑÑвÑÑ Ð¾Ð±ÑабоÑÑик onclose
) ÑÑÐ¾Ð±Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°ÑиÑÑ Ð¿ÑиÑÐ¸Ð½Ñ Ð·Ð°ÐºÑÑÑÐ¸Ñ ÑоединениÑ.
Ðднако, наÑÐ¸Ð½Ð°Ñ Ñ Ð²ÐµÑÑии Firefox 11, ÑипиÑнÑм ÑвлÑеÑÑÑ Ð¿Ð¾Ð»ÑÑение в конÑÐ¾Ð»Ñ Ð¾Ñ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ Mozilla ÑаÑÑиÑенного ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке и кода завеÑÑениÑ, как Ñо опÑеделено в RFC 6455, Section 7.4 поÑÑедÑÑвом CloseEvent
.
ÐÑÐ¾Ñ Ð¿ÑоÑÑой пÑÐ¸Ð¼ÐµÑ ÑоздаÑÑ Ð½Ð¾Ð²Ñй WebSocket, подклÑÑаемÑй к ÑеÑвеÑÑ ws://www.example.com/socketserver
. Рданном пÑимеÑе в конÑÑÑÑкÑÐ¾Ñ ÑокеÑа в каÑеÑÑве дополниÑелÑного паÑамеÑÑа пеÑедаÑÑÑÑ Ð¿Ð¾Ð»ÑзоваÑелÑÑкий пÑоÑокол "protocolOne", Ñ
оÑÑ ÑÑа ÑаÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð¿ÑÑена.
var exampleSocket = new WebSocket(
"ws://www.example.com/socketserver",
"protocolOne",
);
ÐоÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑнкÑии, exampleSocket.readyState
бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°Ñение CONNECTING
. readyState
измениÑÑÑ Ð½Ð° OPEN
как ÑолÑко Ñоединение ÑÑÐ°Ð½ÐµÑ Ð³Ð¾ÑовÑм к пеÑедаÑе даннÑÑ
.
ÐÑли нÑжно оÑкÑÑÑÑ Ñоединение, поддеÑживаÑÑее неÑколÑко пÑоÑоколов, можно пеÑедаÑÑ Ð¼Ð°ÑÑив пÑоÑоколов:
var exampleSocket = new WebSocket("ws://www.example.com/socketserver", [
"protocolOne",
"protocolTwo",
]);
Ðогда Ñоединение ÑÑÑановлено (ÑÑо ÑооÑвеÑÑÑвÑеÑ, readyState
OPEN
), exampleSocket.protocol
ÑообÑиÑ, какой пÑоÑокол вÑбÑал ÑеÑвеÑ.
РпÑиведеннÑÑ
вÑÑе пÑимеÑаÑ
ws
заменÑÐµÑ http
, аналогиÑно wss
заменÑÐµÑ https
. УÑÑановка ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑеÑез WebSocket завиÑÐ¸Ñ Ð¾Ñ Ð¼ÐµÑ
анизма Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ HTTP, Ñаким обÑазом запÑÐ¾Ñ Ð½Ð° обновление неÑвнÑй, когда Ð¼Ñ Ð¾Ð±ÑаÑаемÑÑ Ðº ÑеÑвеÑÑ HTTP Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ws://www.example.com
или wss://www.example.com
.
ÐÐ´Ð½Ð°Ð¶Ð´Ñ Ð¾ÑкÑÑв Ñоединение, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пеÑедаваÑÑ Ð´Ð°Ð½Ð½Ñе на ÑеÑвеÑ. ÐÐ»Ñ Ð¾ÑÑÑеÑÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑÑого, вÑзовиÑе меÑод send()
обÑекÑа WebSocket
Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑообÑение, коÑоÑое желаеÑе оÑпÑавиÑÑ:
exampleSocket.send("ÐÐ¾Ñ ÑекÑÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð¾ÑпÑавлен ÑеÑвеÑÑ.");
ÐÑ Ð¼Ð¾Ð¶ÐµÑе пеÑеÑÑлаÑÑ Ð´Ð°Ð½Ð½Ñе в виде ÑÑÑоки, Blob
, Ñак и ArrayBuffer
.
ÐÑимеÑание: Ðо веÑÑии 11, Firefox поддеÑживал оÑпÑÐ°Ð²ÐºÑ Ð´Ð°Ð½Ð½ÑÑ ÑолÑко в виде ÑÑÑоки.
Так как ÑÑÑановка ÑÐ¾ÐµÐ´Ð¸ÐµÐ½Ð¸Ñ Ð°ÑинÑ
Ñонна и подвеÑжена ÑбоÑм, Ñо Ð½ÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ гаÑанÑии, ÑÑо вÑзов меÑода send()
, поÑле ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑа WebSocket, бÑÐ´ÐµÑ Ð·Ð°Ð²ÐµÑÑен ÑÑпеÑно. Ðо кÑайней меÑе, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ бÑÑÑ ÑвеÑенÑ, ÑÑо попÑÑка оÑпÑавиÑÑ Ð´Ð°Ð½Ð½Ñе бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð¼ÐµÑÑо ÑолÑко поÑле Ñого, как Ñоединение бÑÐ´ÐµÑ ÑÑÑановлено, опÑеделив обÑабоÑÑик onopen
Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑого дейÑÑвиÑ:
exampleSocket.onopen = function (event) {
exampleSocket.send("ÐÐ¾Ñ ÑекÑÑ, коÑоÑÑй бÑÐ´ÐµÑ Ð¾ÑпÑавлен ÑеÑвеÑÑ.");
};
ÐÑполÑзование JSON Ð´Ð»Ñ Ð¿ÐµÑедаÑи обÑекÑов
Ðдна ÑÐ´Ð¾Ð±Ð½Ð°Ñ Ð²ÐµÑÑ ÐºÐ¾ÑоÑÑÑ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑделаÑÑ, ÑÑо иÑполÑзоваÑÑ JSON Ð´Ð»Ñ Ð¿ÐµÑеÑÑлки ÑложнÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð½Ð° ÑеÑвеÑ. ÐапÑимеÑ, пÑиложение-ÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвоваÑÑ Ñ ÑеÑвеÑом, иÑполÑзÑÑ Ð¿ÑоÑокол, ÑеализованнÑй Ñ Ð¸ÑполÑзованием пакеÑов даннÑÑ , инкапÑÑлиÑованнÑÑ Ð² JSON:
// ÐÑпÑавÑÑе ÑекÑÑ Ð²Ñем полÑзоваÑелÑм ÑеÑез ÑеÑвеÑ
function sendText() {
// СоздайÑе обÑÐµÐºÑ ÑодеÑжаÑий даннÑе, необÑ
одимÑе ÑеÑвеÑÑ Ð´Ð»Ñ Ð¾Ð±Ñабоки ÑообÑÐµÐ½Ð¸Ñ Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñа ÑаÑа.
var msg = {
type: "message",
text: document.getElementById("text").value,
id: clientID,
date: Date.now(),
};
// ÐÑпÑавÑÑе обÑÐµÐºÑ Ð² виде JSON ÑÑÑоки.
exampleSocket.send(JSON.stringify(msg));
// ÐÑиÑÑиÑе ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð²Ð²Ð¾Ð´Ð° ÑекÑÑа, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑледÑÑÑÑÑ ÑÑÑÐ¾ÐºÑ ÑекÑÑа Ð¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ.
document.getElementById("text").value = "";
}
ÐолÑÑение ÑообÑений Ð¾Ñ ÑеÑвеÑа
WebSockets â ÑÑо API, ÑпÑавлÑемÑй ÑобÑÑиÑми; когда ÑообÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑÑенÑ, ÑобÑÑие "message" доÑÑавлено в ÑÑнкÑÐ¸Ñ onmessage
. ЧÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ Ð¿ÑоÑлÑÑивание вÑ
одÑÑиÑ
даннÑÑ
, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑделаÑÑ ÑÑо-Ñо вÑоде ÑÑого:
exampleSocket.onmessage = function (event) {
console.log(event.data);
};
ÐолÑÑение и инÑеÑпÑеÑаÑÐ¸Ñ JSON обÑекÑов
ÐавайÑе ÑаÑÑмоÑÑим клиенÑÑкое пÑиложение ÑаÑа, коÑоÑое впеÑвÑе ÑпоминалоÑÑ Ð² Ñазделе ÐÑполÑзование JSON Ð´Ð»Ñ Ð¿ÐµÑедаÑи обÑекÑов. ÐÑÑÑ ÑазнÑе ÑÐ¸Ð¿Ñ Ð¿Ð°ÐºÐµÑов даннÑÑ , коÑоÑÑе Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð»ÑÑиÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ, напÑимеÑ:
Ðод обÑабаÑÑваÑÑий ÑÑи Ð²Ñ Ð¾Ð´ÑÑие ÑообÑениÑ, Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
exampleSocket.onmessage = function (event) {
var f = document.getElementById("chatbox").contentDocument;
var text = "";
var msg = JSON.parse(event.data);
var time = new Date(msg.date);
var timeStr = time.toLocaleTimeString();
switch (msg.type) {
case "id":
clientID = msg.id;
setUsername();
break;
case "username":
text =
"<b>User <em>" +
msg.name +
"</em> signed in at " +
timeStr +
"</b><br>";
break;
case "message":
text = "(" + timeStr + ") <b>" + msg.name + "</b>: " + msg.text + "<br>";
break;
case "rejectusername":
text =
"<b>Your username has been set to <em>" +
msg.name +
"</em> because the name you chose is in use.</b><br>";
break;
case "userlist":
var ul = "";
for (i = 0; i < msg.users.length; i++) {
ul += msg.users[i] + "<br>";
}
document.getElementById("userlistbox").innerHTML = ul;
break;
}
if (text.length) {
f.write(text);
document.getElementById("chatbox").contentWindow.scrollByPages(1);
}
};
ÐдеÑÑ Ð¼Ñ Ð¸ÑполÑзÑем JSON.parse()
ÑÑÐ¾Ð±Ñ Ð¿ÑеобÑазоваÑÑ JSON ÑÑÑÐ¾ÐºÑ Ð² обÑекÑ, заÑем обÑабоÑайÑе его.
ТекÑÑ, полÑÑеннÑй ÑеÑез WebSocket должен имеÑÑ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÑ UTF-8
Ðо Gecko 9.0, некоÑоÑÑе не ÑимволÑнÑе знаÑÐµÐ½Ð¸Ñ Ð² допÑÑÑимом ÑекÑÑе UTF-8 могÑÑ Ð¿ÑивеÑÑи к ÑазÑÑÐ²Ñ ÑоединениÑ. ТепеÑÑ Gecko допÑÑÐºÐ°ÐµÑ ÑÑи знаÑениÑ.
ÐакÑÑÑие ÑоединениÑÐогда Ð²Ñ Ð·Ð°ÐºÐ¾Ð½Ñили иÑполÑзоваÑÑ Ñоединение WebSocket, закÑойÑе его иÑполÑзÑÑ Ð¼ÐµÑод close()
:
ÐеÑед попÑÑкой закÑÑÑÑ Ñоединение Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ пÑовеÑиÑÑ Ð°ÑÑибÑÑ bufferedAmount
ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ, не пеÑÐµÐ´Ð°Ð½Ñ Ð»Ð¸ еÑе какие-либо даннÑе по ÑеÑи.
WebSocket не ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð² ÑÑеде Ñо ÑмеÑаннÑм ÑодеÑжимÑм: Ñо еÑÑÑ Ð²Ñ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¾ÑкÑÑваÑÑ Ð½ÐµÐ·Ð°ÑиÑенное Ñоединение WebSocket Ñо ÑÑÑаниÑÑ, загÑÑженной Ñ Ð¸ÑполÑзованием HTTPS, или наобоÑоÑ. ФакÑиÑеÑки, некоÑоÑÑе бÑаÑзеÑÑ Ñвно запÑеÑаÑÑ ÑÑо, напÑÐ¸Ð¼ÐµÑ Firefox 8 и вÑÑе.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4