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,errorwebsocket ,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.infoWebSocket WebSocketOriginWeb WebSocketConnection: UpgradeUpgrade: websocketwebsocketSec-WebSocket-KeySec-WebSocket-VersionWebSock 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-frameWebSocketSec-WebSocket-Extensions -
Sec-WebSocket-Protocol: soap, wampSOAP WAMP (The WebSocket Application Messaging Protocol) WebSocket IANA cataloguenew 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]);
codeWebSocket ()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,- .
WebSocket HTTP 1000
//
socket.onclose = event => {
// event.code === 1006
// event.reason === ""
// event.wasClean === false (no closing frame)
};
(Connection state)
socket.readyState :
0CONNECTING: ,1OPEN: ,2CLOSING: ,3CLOSED: .
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)clientsmessage - 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)