C.W.K.
Stream
Lesson 02 of 08 · published

Connection 이벤트

~11 min · browser, events

Level 0Poller
0 XP0/60 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

네 개 이벤트, 그게 전부

브라우저 WebSocket 노출하는 이벤트 정확히 네 개: open, message, error, close. on* property (handler 1개) 또는 addEventListener (multi handler, 추천) 둘 다 ok. connecting 이벤트 없고 reconnect 이벤트 없고 pong 이벤트 없고 — 다 직접 만들 거야.

발화 순서

정상 세션: open → message* → close. handshake 실패: error → close. runtime drop: ...message → error → close. 결정적으로 errorclose 보다 항상 먼저 떨어지는데, error 는 의도적으로 별로 안 노출해 — 보안상 브라우저가 connection 실패 이유 안 leak 해. close code 와 reason 알려면 close 이벤트 봐.

받는 것

messageevent.data 는 string (text frame), Blob (binary 의 default), ArrayBuffer (ws.binaryType = 'arraybuffer' 설정 시) 중 하나. close 이벤트의 event.code, event.reason, event.wasClean 가 어떻게 끝났는지 알려줘.

Code

네 이벤트 전부 wiring·javascript
const ws = new WebSocket('wss://api.example.com/ws');

ws.addEventListener('open', () => {
  console.log('connected, sending greeting');
  ws.send(JSON.stringify({ type: 'hello' }));
});

ws.addEventListener('message', (event) => {
  // event.data: string | Blob | ArrayBuffer
  if (typeof event.data === 'string') {
    console.log('text:', event.data);
  } else {
    console.log('binary frame, bytes:', event.data.size ?? event.data.byteLength);
  }
});

ws.addEventListener('error', () => {
  // Deliberately opaque. Look at the close event for details.
  console.warn('ws error (details in close)');
});

ws.addEventListener('close', (event) => {
  console.log('closed', {
    code:     event.code,
    reason:   event.reason,
    wasClean: event.wasClean,
  });
});
Listener 제대로 제거·javascript
function onMessage(e) { console.log(e.data); }
ws.addEventListener('message', onMessage);
// later...
ws.removeEventListener('message', onMessage);

External links

Exercise

<input><pre> 가진 작은 페이지 짜. load 시 echo server 에 WebSocket 열어. 네 이벤트 다 <pre> 에 prefix ([open] / [msg] / [err] / [close 1006]) 로 append. wifi 10초 죽여서 disconnect 강제. 결과 close code 화면에서 읽어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.