서버와 브라우저 간 연결을 유지한 상태로 데이터를 교환할 수 있다.
WebSocket
객체는 서버와의 WebSocket 연결을 생성하고 관리할 수 있는 API들을 제공한다.
WebSocket
생성자는 하나의 필수 파라미터와, 하나의 옵셔널 파라미터를 받는다.
WebSocket WebSocket(
in DOMString url,
in optional (DOMString or DOMString[]) protocols
)
url
protocols
(optional)let socket = new WebSocket("ws://javascript.info");
ws
, wss
라는 특수 프로토콜을 사용한다.
둘의 관계는 http
, https
와 유사하다.
GET /chat
Host: javascript.info
Origin: https://javascript.info
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: Iv8io/9s+lYFgZWcXczP8Q==
Sec-WebSocket-Version: 13
HTTP
프로토콜로 연결확인 응답101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: hsBlbuDTkk24srzEOTBUlZAlC2g=
ws/wss
프로토콜로 연결연결 혹은 연결 시도를 종료한다. 연결이 끊어진 상태에서는 아무 동작도 하지 않는다.
void close(
in optional unsigned short code,
in optional DOMString reason
)
code
(optional)reason
(optional)웹 소켓 연결을 통해 데이터를 서버로 전송
void send(
in DOMString data
)
void send(
in ArrayBuffer data
)
void send(
in Blob data
)
data
binaryType
bufferedAmount
(read only)// 100ms에 한번씩 조건에 따라 send()를 호출한다.
// send()로 데이터 전송을 요청했지만 네트워크에 전달되지 않은 데이터가 있을 때는 아무런 동작도 하지 않는다.
setInterval(() => {
if (socket.bufferedAmount == 0) {
socket.send(moreData());
}
}, 100);```
extensions
protocol
onclose
onopen
onerror
onmessage
url
(read only)readyState
(read only)Constant | Value | Description |
---|---|---|
CONNECTING | 0 | 연결이 수립되지 않은 상태 |
OPEN | 1 | 연결이 수립되어 데이터 교환이 가능한 상태 |
CLOSING | 2 | 연결이 닫히는 중 |
CLOSED | 3 | 연결이 종료되었거나 연결에 실패 |
웹 소켓은 ‘프레임(frame)'이라는 데이터 조각을 사용해 이루어진다. 프레임은 서버와 클라이언트 양측 모두에서 보낼 수 잇는데 프레임 내 담긴 데이터 종류에 따라 다음과 같이 분류할 수 있다.
브라우저 환경에서는 텍스트, 이진 프레임만 다룬다.
socket.send(body)
body
에는 문자열이나 Blob
, ArrayBuffer
등의 이진 데이터만 들어갈 수 있다.
데이터의 종류에 따라 특별히 무언가 세팅을 해줘야 할 필요는 없다.
텍스트 데이터는 항상 문자열 형태로 온다.
이진 데이터를 받을 땐 binaryType
프로퍼티를 사용해서 Blob
이나 ArrayBuffer
포맷 둘 중 하나를 고를 수 있다.
binaryType
의 default값이 "blob"이므로 이진 데이터는 기본적으로 Blob
형태로 받게 된다.
socket.binaryType = "arraybuffer"
socket.onmessage = (event) => {
const myData = event.data
// event.data는 텍스트인 경우 문자열,
// 이진 데이터인 경우 arraybuffer
}