WebSocket ãããã³ã«ã¯ä»æ§ RFC 6455 ã§èª¬æããã¦ãããããã¯æ°¸ç¶çãªæ¥ç¶ãä»ãã¦ãã©ã¦ã¶ã¨ãµã¼ãéã§ãã¼ã¿ã交æããæ¹æ³ãæä¾ãã¾ããæ¥ç¶ã®åæã追å ã®HTTPãªã¯ã¨ã¹ãããããã¨ãªãããã¼ã¿ã âãã±ããâ ã¨ãã¦åæ¹åã«æ¸¡ããã¨ãã§ãã¾ãã
WebSocket ã¯ç¶ç¶çã«ãã¼ã¿äº¤æãå¿ è¦ã¨ãããããªãµã¼ãã¹ã«ç¹ã«é©ãã¦ãã¾ããä¾ãã°ããªã³ã©ã¤ã³ã²ã¼ã ããªã¢ã«ã¿ã¤ã ã®åå¼ã·ã¹ãã ãªã©ã§ãã
ç°¡åãªä¾
websocket ã®æ¥ç¶ãéãã«ã¯ãurl ã®ç¹å¥ãªãããã³ã« ws ã使ç¨ãã new WebSocket ãä½ãå¿
è¦ãããã¾ã:
let socket = new WebSocket("ws://javascript.info");
æå·åããã wss:// ãããã³ã«ãããã¾ããwebsocket ã® HTTPS çã®ãããªãã®ã§ãã
wss:// ã好ã¾ããã§ãwss:// ãããã³ã«ã¯æå·åãããã ãã§ãªããããä¿¡é ¼æ§ãããã¾ãã
ããã¯ãws:// ã®ãã¼ã¿ã¯æå·åããã¦ãããããããã仲ä»è
ã«è¦ããããã§ããå¤ããããã·ãµã¼ãã«ãã£ã¦ã¯ WebSocket ãèªèããªããããããããªãããã«è¦ããæ¥ç¶ã䏿¢ããå¯è½æ§ãããã¾ãã
䏿¹ãwss:// 㯠WebSocket over TLS (HTTPS ã HTTP over TLS ã§ããã®ã¨åã)ã§ãããTLS ã¯éä¿¡å´ã§ãã¼ã¿ãæå·åããåä¿¡å´ã§å¾©å·åãã¾ãããã®ããããã¼ã¿ãã±ããã¯æå·åããã¦ãããã·ãééãã¾ãããããã·ã¯ä¸èº«ãè¦ããã¨ã¯ã§ãããããããééããã¾ãã
ã½ã±ããã使ãããã¨ãããã§çºçããã¤ãã³ãããªãã¹ã³ããå¿ è¦ãããã¾ããå ¨é¨ã§4ã¤ã®ã¤ãã³ããããã¾ãã:
openâ æ¥ç¶ã確ç«ããã¾ãã,messageâ ãã¼ã¿ãåãåãã¾ãã,errorâ websocket ã¨ã©ã¼,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 {
// e.g. ãµã¼ãã®ããã»ã¹ã忢ããããã¯ãããã¯ã¼ã¯ãã¦ã³
// ãã®å ´åãevent.code ã¯é常 1006 ã«ãªãã¾ã
alert('[close] Connection died');
}
};
socket.onerror = function(error) {
alert(`[error] ${error.message}`);
};
ãã¢ç¨ã«ãä¸è¨ã®ä¾ã§ã¯ Node.js ã§æ¸ãããå°ããªãµã¼ã server.jsãåä½ãã¦ãã¾ãããã㯠âHello from server, Johnâ ã¨å¿çãã5ç§å¾ ã£ã¦ããæ¥ç¶ãã¯ãã¼ãºãã¾ãã
ãªã®ã§ã open â message â close ã®ã¤ãã³ãã表示ãããã¯ãã§ãã
ããã ãã§ããã¨ã¦ãç°¡åã§ããã
ã§ã¯ãããããã¯ãã詳ããè¦ã¦ããã¾ãããã
websocket ã®ãªã¼ãã³
new WebSocket(url) ãçæãããã¨ãããã«æ¥ç¶ãéå§ããã¾ãã
æ¥ç¶ä¸ããã©ã¦ã¶ã¯(ããããå©ç¨ãã¦)ãµã¼ãã«åãåããã¾ã: âWebsocket ããµãã¼ããã¦ãã¾ããï¼âãããã¦ãµã¼ãã âã¯ãâ ã¨åçããå ´åãWebSocket ãããã³ã«ã§ããã¨ããç¶ãã¾ãããã㯠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â ã¯ã©ã¤ã¢ã³ããã¼ã¸ã®ãªãªã¸ã³ã§ããä¾.https://javascript.infoãWebSocket ãªãã¸ã§ã¯ãã¯ãã¨ãã¨ã¯ãã¹ãªãªã¸ã³ã§ããç¹å¥ãªãããããã®ä»ã®å¶éã¯ããã¾ãããå¤ããµã¼ãã¯ã©ã®ã¿ã¡ WebSocket ãå¦çãããã¨ãã§ããªãã®ã§ãäºææ§ã®åé¡ã¯ããã¾ãããã§ãããOriginãããã¯éè¦ã§ããããã«ãããµã¼ãã Webãµã¤ã㨠WebSocket ãããåãããããæ±ºããããã§ããConnection: Upgradeâ ã¯ã©ã¤ã¢ã³ãããããã³ã«ã®å¤æ´ã叿ããåå³ã§ããUpgrade: websocketâ ãªã¯ã¨ã¹ãããããããã³ã«ã¯ âwebsocketâ ã§ããSec-WebSocket-Keyâ ã»ãã¥ãªãã£ã®ããã®ããã©ã¦ã¶ãçæããã©ã³ãã ãªãã¼ã§ããSec-WebSocket-Versionâ WebSock ãããã³ã«ã®ãã¼ã¸ã§ã³ã§ããç¾å¨ã¯ 13 ã§ãã
JavaScript ã¯ãããã®ããããè¨å®ãããã¨ã許å¯ãã¦ãã¾ããããã®ããããã®æã® HTTP ãªã¯ã¨ã¹ããè¡ãããã«ãXMLHttpRequest ã fetch ã使ããã¨ã¯ã§ãã¾ããã
ãµã¼ãã WebSocket ã«åãæ¿ãããã¨ã«åæããã¨ãã³ã¼ã 101 ã®å¿çãè¿ãå¿ è¦ãããã¾ã:
101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g=
ããã§ãSec-WebSocket-Accept ã¯ç¹å¥ãªã¢ã«ã´ãªãºã ã使ç¨ãã¦ç®åºããã Sec-WebSocket-Key ã§ãããã©ã¦ã¶ã¯ããã使ã£ã¦ããªã¯ã¨ã¹ãã«å¯¾å¿ããã¬ã¹ãã³ã¹ã§ãããã¨ã確èªãã¾ãã
ãã®å¾ããã¼ã¿ã¯ WebSocket ãããã³ã«ã使ç¨ãã¦è»¢éããã¾ãããããããã®æ§é ãè¦ã¦ãã¾ãããããªãããã㯠HTTP ã§ã¯ããã¾ããã
æ¡å¼µã¨ãµããããã³ã«
æ¡å¼µããµããããã³ã«ãè¨è¿°ããã追å ã®ããã Sec-WebSocket-Extensions 㨠Sec-WebSocket-Protocol ãããã¾ãã
ä¾:
-
Sec-WebSocket-Extensions: deflate-frameã¯ãã©ã¦ã¶ããã¼ã¿å§ç¸®ããµãã¼ããããã¨ãæå³ãã¾ããæ¡å¼µã¯ãã¼ã¿è»¢éã«é¢ãããã®ãããWebSocketãããã³ã«ãæ¡å¼µããæ©è½ã§ãããããSec-WebSocket-Extensionsã¯ããµãã¼ããããã¹ã¦ã®æ¡å¼µã®ãªã¹ãã¨ã¨ãã«ãã©ã¦ã¶ã«ãã£ã¦èªåçã«éä¿¡ããã¾ãã -
Sec-WebSocket-Protocol: soap, wampã¯ä»»æã®ãã¼ã¿ã ãã§ãªããSOAP ããã㯠WAMP (âThe WebSocket Application Messaging Protocolâ) ãããã³ã«ã®ãã¼ã¿ã転éãããã¨ãæå³ãã¾ããWebSocket ãµããããã³ã«ã¯ IANA catalogue ã«ç»é²ããã¦ãã¾ãããªãã·ã§ã³ã®ãããã¯ã
new WebSocketã®ç¬¬ï¼å¼æ°(ä»»æ)ã§æå®ããããã®ã§ãããããããã®ã³ã¼ããã©ã®ãµããããã³ã«ããµãã¼ããããããµã¼ãã«ä¼ãã¾ããããã¯ãµããããã³ã«ã®é åã§ãããä¾ãã°ãSOAP ããã㯠WAMP ã使ãããå ´åã«ã¯æ¬¡ã®ããã«ãã¾ã:let socket = new WebSocket("wss://javascript.info/chat", ["soap", "wamp"]);
ãµã¼ãã¯ã使ç¨ã«åæãããããã³ã«ã¨æ¡å¼µã®ãªã¹ããè¿ãå¿ è¦ãããã¾ãã
ä¾ãã°ã次ã®ãªã¯ã¨ã¹ããè¦ã¦ãã ããã:
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
ããã§ã¯ããµã¼ãã¯æ¡å¼µ âdeflate-frameâ ã¨ããªã¯ã¨ã¹ãããããµããããã³ã«ã®ãã¡ SOAP ã®ã¿ããµãã¼ãããã¨å¿çãã¦ãã¾ãã
ãã¼ã¿è»¢é
WebSocket é信㯠âãã¬ã¼ã â (ãã¼ã¿ãã©ã°ã¡ã³ããã©ã¡ãå´ããã§ãéä¿¡ã§ããããã¤ãã®ç¨®é¡ãããã¾ã)ã§æ§æããã¾ãã :
- âtext framesâ â é¢ä¿è ãäºãã«éä¿¡ããããã¹ããã¼ã¿ãå«ãã§ãã¾ãã
- âbinary data framesâ â é¢ä¿è ãäºãã«éä¿¡ãããã¤ããªãã¼ã¿ãå«ãã§ãã¾ãã
- âping/pong framesâ ã¯æ¥ç¶ç¢ºèªã«ä½¿ç¨ããã¾ãããµã¼ãããéä¿¡ããããã©ã¦ã¶ã¯èªåã§ãããã«å¿çãã¾ãã
- âconnection close frameâ ããã®ä»ããã¤ãã®ãµã¼ãã¹ãã¬ã¼ã ãããã¾ãã
ãã©ã¦ã¶ã§ã¯ãããã¹ããã¬ã¼ã ã¾ãã¯ãã¤ããªãã¬ã¼ã ã®ã¿ãç´æ¥æ±ãã¾ãã
WebSocket .send() ã¡ã½ããã¯ããã¹ãã¾ãã¯ãã¤ããªãã¼ã¿ãéä¿¡ã§ãã¾ãã
socket.send(body) å¼ã³åºãã¯ãæååã¾ã㯠Blob ã ArrayBuffer ãªã©ãå«ããã¤ããªå½¢å¼ã® body ã許å¯ããã¾ããè¨å®ã¯å¿
è¦ããã¾ãããä»»æã®ãã©ã¼ãããã§éä¿¡ããã ãã§OKã§ãã
ãã¼ã¿ãåä¿¡ããã¨ããããã¹ãã¯å¸¸ã«æååã¨ãã¦æ¥ã¾ããã¾ãããã¤ããªãã¼ã¿ã®å ´å㯠Blobã ArrayBuffer å½¢å¼ã®ããããã鏿ãããã¨ãã§ãã¾ãã
ãã㯠socket.bufferType ããããã£ã§è¨å®ããã¾ããããã©ã«ã㯠"blob" ãªã®ã§ããã¤ããªãã¼ã¿ã¯ Blob ãªãã¸ã§ã¯ãã§æ¥ã¾ãã
Blob ã¯é«ã¬ãã«ã®ãã¤ããªãªãã¸ã§ã¯ãã§ã<a>, <img> çã¨ãã£ãã¿ã°ã¨ç´æ¥çµ±åããã¾ãããã®ãããããã¯å¦¥å½ãªããã©ã«ãå¤ã§ãããã ããããªããªå¦çã®å ´åã«åã
ã®ãã¤ããã¼ã¿ã«ã¢ã¯ã»ã¹ããå¿
è¦ãããã°ã"arraybuffer" ã«å¤æ´ãããã¨ãã§ãã¾ãã
socket.bufferType = "arraybuffer";
socket.onmessage = (event) => {
// event.data ã¯æåå(ããã¹ãã®å ´å)ã arraybuffer (ãã¤ããªã®å ´å)) ã§ã
};
ã¬ã¼ããªããã(Rate limiting)
ç§ãã¡ã®ã¢ããªãéä¿¡ãã¹ã大éã®ãã¼ã¿ãçæãã¦ããã¨æ³åãã¦ãã ãããã§ãããã¦ã¼ã¶ã¯ä½éã®ãããã¯ã¼ã¯æ¥ç¶ã§ãæããéå¤ã®ã¢ãã¤ã«ã¤ã³ã¿ã¼ãããã ã¨ãã¾ãã
ä½åº¦ã socket.send(data) ãå¼ã³åºããã¨ã¯ã§ãã¾ããããã¼ã¿ã¯ã¡ã¢ãªã«ãããã¡(ä¿æ)ããããããã¯ã¼ã¯é度ã許å¯ããç¯å²ã§ã§ããã ãæ©ãéä¿¡ããã¾ãã
socket.bufferedAmount ããããã£ã¯ãã®æç¹ã§ãããã¡ããã¦ãã(ãããã¯ã¼ã¯çµç±ã§éä¿¡ãããã®ãå¾
ã£ã¦ãã)ãã¤ãæ°ãæ ¼ç´ããã¦ãã¾ãã
ããã調ã¹ããã¨ã§ãã½ã±ãããå®éã«éä¿¡å¯è½ãã確èªãããã¨ãã§ãã¾ãã
// 100 ms æ¯ã«ã½ã±ãããæ¤æ»ãæ¢åã®ãã¼ã¿ããã¹ã¦éä¿¡ããã¦ããã°è¿½å ã®ãã¼ã¿ãéä¿¡ãã¾ãã
setInterval(() => {
if (socket.bufferedAmount == 0) {
socket.send(moreData());
}
}, 100);
æ¥ç¶ãéãã
éå¸¸ãæ¥ç¶ãéãããã¨ã(ãã©ã¦ã¶ã¨ãµã¼ãã¯åçã®æ¨©éãæã¡ã¾ã)ã¯ãæ°å¤ã³ã¼ãã¨ããã¹ãã«ããçç±ã¨ãåãã㦠âconnection close frameâ ãéä¿¡ãã¾ãã
ãã®ããã®ã¡ã½ããã¯æ¬¡ã®éãã§ã:
socket.close([code], [reason]);
codeã¯ç¹å¥ãª WebSocket çµäºã³ã¼ãã§ã(ãªãã·ã§ã³)reasonã¯çµäºã®çç±ã説æããæååã§ã(ãªãã·ã§ã³)
次ã«ãclose ã¤ãã³ããã³ãã©ã®ç¸æã¯ãã®ã³ã¼ãã¨çç±ãåå¾ãã¾ã, e.g.:
// ã¯ãã¼ãºããå´:
socket.close(1000, "Work complete");
// ç¸æ
socket.onclose = event => {
// event.code === 1000
// event.reason === "Work complete"
// event.wasClean === true (clean close)
};
æãä¸è¬çãªã³ã¼ãå¤ã§ã:
1000â ããã©ã«ãã§ãé常ã®ã¯ãã¼ãºã§ã(codeããªãå ´åã«ä½¿ããã¾ã),1006â æåã§ãã®ã³ã¼ãã«ããæ¹æ³ã¯ãªããæ¥ç¶ã失ããããã¨ã示ãã¾ã(ã¯ãã¼ãºãã¬ã¼ã ãªã).
次ã®ãããªã³ã¼ããããã¾ã:
1001â ãµã¼ããã·ã£ãããã¦ã³ããããã©ã¦ã¶ããã¼ã¸ãé¢ããå ´åãªã©ãå½äºè ãã©ããã«å»ã£ã,1009â ã¡ãã»ã¼ã¸ã大ãããã¦å¦çã§ããªã,1011â ãµã¼ãã§ã®äºæããªãã¨ã©ã¼,- â¦ãªã©.
å ¨ãªã¹ã㯠RFC6455, §7.4.1 ã«ããã¾ãã
WebSocket ã®ã³ã¼ã㯠HTTP ã®ã³ã¼ãã«ããç¨åº¦ä¼¼ã¦ãã¾ããå¥ç©ã§ããç¹ã« 1000 ããå°ããæ°åã¯äºç´ããã¦ããããã®ãããªã³ã¼ããè¨å®ãããã¨ããã¨ã¨ã©ã¼ã«ãªãã¾ãã
// æ¥ç¶ãå£ããå ´å
socket.onclose = event => {
// event.code === 1006
// event.reason === ""
// event.wasClean === false (no closing frame)
};
æ¥ç¶ç¶æ (Connection state)
æ¥ç¶ç¶æ
ã¯æ¬¡ã®ãããªå¤ãã㤠socket.readyState ããããã£ã§åå¾ã§ãã¾ãã:
0â âCONNECTINGâ: æ¥ç¶ã¯ã¾ã 確ç«ããã¦ãã¾ãã,1â âOPENâ: æ¥ç¶ã¯ç¢ºç«ãéä¿¡ä¸,2â âCLOSINGâ: æ¥ç¶ã¯ã¯ãã¼ãºä¸ã§ã,3â âCLOSEDâ: æ¥ç¶ã¯ã¯ãã¼ãºããã¦ãã¾ã.
ãã£ããã®ãµã³ãã«
ãã©ã¦ã¶ã® WebSocket API 㨠Node.js WebSocket ã¢ã¸ã¥ã¼ã« 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>
JavaScript ããæ¬¡ã®3ã¤ã®ãã¨ããã¾ã:
- æ¥ç¶ããªã¼ãã³ãã¾ã
- ãã©ã¼ã ã®éä¿¡ â ã¡ãã»ã¼ã¸ã«å¯¾ãã¦
socket.send(message)ããã¾ã - ã¡ãã»ã¼ã¸ã®åä¿¡ â
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#message ã«ã¡ãã»ã¼ã¸ã«è¡¨ç¤ºãã¾ã
socket.onmessage = function(event) {
let message = event.data;
let messageElem = document.createElement('div');
messageElem.textContent = message;
document.getElementById('messages').prepend(messageElem);
}
ãµã¼ããµã¤ãã®ã³ã¼ãã¯ãå°ãä»åã®ã¹ã³ã¼ããè¶ ãã¦ãã¾ããããã§ã¯ Node.js ã使ã£ã¦ãã¾ãããããã§ãªãã¦ãOKã§ããä»ã®ãã©ãããã©ã¼ã ã«ã WebSocket ã§ããåãããææ®µãããã¾ãã
ãµã¼ããµã¤ãã®ã¢ã«ã´ãªãºã ã¯æ¬¡ã®éãã§ã:
- socket ã®éå
clients = new Set()ã使ãã¾ãã - åãå
¥ããããå websocket ã
clients.add(socket)ã§ clients ã«è¿½å ããmessageã¤ãã³ããªã¹ãã¼ãè¨å®ããã¡ãã»ã¼ã¸ãåå¾ãã¾ãã - ã¡ãã»ã¼ã¸ãåä¿¡ããã¨ãclients ãã¤ãã¬ã¼ããå ¨å¡ã«éä¿¡ãã¾ãã
- æ¥ç¶ãéããããã¨ã
clients.delete(socket)ããã¾ãã
const ws = new require('ws');
const wss = new ws.Server({noServer: true});
const clients = new Set();
http.createServer((req, res) => {
// ããã§ã¯ websocket æ¥ç¶ã®ã¿ãå¦çãã¾ã
// å®éã®ããã¸ã§ã¯ãã§ã¯ãé-websocket ãªã¯ã¨ã¹ããå¦çããã³ã¼ããããã«ããã¾ã
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);
});
}
åä½ãããµã³ãã«ã§ã:
ãã¦ã³ãã¼ã(iframeã®å³ä¸ã®ãã¿ã³)ããã¦ããã¼ã«ã«ã§å®è¡ãããã¨ãã§ãã¾ããå®è¡åã« Node.js ã®ã¤ã³ã¹ãã¼ã«ã¨ npm install ws ãããã®ãå¿ããªãã§ãã ããã
ãµããª
WebSocket ã¯ãã©ã¦ã¶ â ãµã¼ãéã§ã®æ°¸ç¶çãªæ¥ç¶ãç¶æããã ãã®ã¢ãã³ãªæ¹æ³ã§ãã
- WebSocket ã«ã¯ã¯ãã¹ãªãªã¸ã³å¶ç´ã¯ããã¾ãã
- ãã©ã¦ã¶ã§ååãµãã¼ãããã¦ãã¾ã
- æååã¨ããªããªãã¼ã¿ãéåä¿¡ããããã¨ãã§ãã¾ã
API ã¯ã·ã³ãã«ã§ãã
ã¡ã½ãã:
socket.send(data),socket.close([code], [reason]).
ã¤ãã³ã:
open,message,error,close.
WebSocket èªä½ã«ã¯åæ¥ç¶ãèªè¨¼ããã®ä»ã®é«ã¬ãã«ã®ã¡ã«ããºã ã¯å«ã¾ãã¦ãã¾ããããã®ããããããå®ç¾ããããã®ã¯ã©ã¤ã¢ã³ã/ãµã¼ã ã©ã¤ãã©ãªãããã¾ããã¾ããããã®æ©è½ãæåã§å®è£ ãããã¨ãã§ãã¾ãã
WebSocket ãæ¢åã®ããã¸ã§ã¯ãã«çµ±åããããã«ãWebSocket ãµã¼ããã¡ã¤ã³ã® HTTP ãµã¼ãã並è¡ãã¦å®è¡ããåä¸ã®ãã¼ã¿ãã¼ã¹ãå
±æããå ´åãããã¾ããWebSocket ã¸ã®ãªã¯ã¨ã¹ã㯠WebSocket ãµã¼ãã«ã¤ãªãããµããã¡ã¤ã³ wss://ws.site.com ã使ç¨ããhttps://site.com ã¯ã¡ã¤ã³ã® HTTP ãµã¼ãã¯ã«è¡ãã¾ãã
ãã¡ãããä»ã®çµ±åæ¹æ³ãå¯è½ã§ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã