Connect WebSocket




HTTP vs WebSocket

http
  • request / response 구조.
  • request를 해야지만 response를 받을 수 있음.
  • 서버가 먼저 response를 보낼 순 없음.
  • 서버는 유저를 기억할 수 없음.
  • request로 쿠키를 보내야 유저가 누구인 지 알 수 있음.
  • stateless
WebSocket
  • 유저가 request를 하면 서버가 accept 또는 deny 할 수 있음.
  • 한 번 accept되면(connection 된 상태) 서버가 유저에게 메세지를 보낼 수도 있고 유저도 서버에게 메세지를 보낼 수 있음.
  • 서버는 request를 기다리지 않음.
  • 한 번 연결되면 서버는 유저를 기억함.
  • 서로에게 직접 접근이 가능
  • 브라우저와 backend 사이 / backend와 backend 사이에서 발생 할 수 있음.
  • bi-directional(양뱡향) 연결





WebSocket 설치


npm i ws

명령어로 설치한다.
express는 http를 다루기 때문에 ws과는 다른 protocol이다.
같은 서버에 ws 기능을 합쳐야하는데, Node.js에 내장되어있는 http package를 사용해서 합칠 수 있다.





WebSocket 서버와 http 서버 합치기


import http from "http";

import WebSocket from "ws";

const server = http.createServer(app);

http서버에 access

const wss = new WebSocket.Server({ server });

http서버 위에 WebSocket 서버 만들기

localhost가 동일한 포트에서 http, ws request 두 개를 다 처리할 수 있다.





FrontEnd와 BackEnd 연결하기


frontend에서 backend로 연결하는 방법은 아래 코드를 사용하는 것임.
image

👉참고


const socket = new WebSocket("ws://localhost:3003");

이렇게 하면 작동하기는 함.
하지만 나중에 핸드폰에서 보면 작동안함.
당연히 폰은 localhost:3003이 존재하지 않기 때문.
브라우저가 스스로 주소를 가져오도록 해야 함.

image

window.location 사용
const  socket  =  new  WebSocket(`ws://${window.location.host}`);


이렇게 연결해주고 server.js에서 아래 코드를 입력해서 실행시키면 콘솔에서 WebSocket을 확인할 수 있다.

wss.on("connection", (socket) => {
  console.log(socket);
});


image

.on(“event”, function)

js의 function과 eventListener처럼 WebSocket도 listen할 수 있는 특정한 event명이 있다. close, connection, error, header, listening 이벤트가 있다. connection은 누군가 우리와 연결됐다는 것이다. 이 method의 설명을 보면 callback으로 socket을 받는다고 한다.



wss.on("connection", (socket) => {
  socket.send("hello!");
});


server.js에서 익명함수로 메세지 보냄.

image


app.js에서 받음.





🚫오류🚫


image


콘솔에 “hello from the browser!”가 출력되어야 하는데 이상한 숫자들이 나옴.


🆗해결🆗


image


toString("utf-8") 으로 해결





Categories:

Updated:

Leave a comment