[ Web Proxy ]
URL:
Viewing: https://ja.javascript.info/websocket [Back]  [Original]

WebSocket
:
Light themeDark theme
DanskEnglishEspaolFranaisIndonesiaItalianoTrkeOzbek
20211215

WebSocket

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.infoWebSocket WebSocket Origin Web WebSocket
  • Connection: Upgrade
  • Upgrade: websocket websocket
  • Sec-WebSocket-Key
  • Sec-WebSocket-Version WebSock 13
WebSocket

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:

  1. socket.send(message)
  2. 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

:

  1. socket clients = new Set()
  2. websocket clients.add(socket) clients message
  3. clients
  4. 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


Web Proxy Viewer  |  New URL  |  Original Page