메뉴 건너뛰기

XEDITION

프로그램

 

웹 소켓 구현하기
웹 소켓 역시 일반적인 TCP 소켓 통신처럼 웹 소켓 역시 서버와 클라이언트간 데이터 교환이 이루어지는 형태이다. 따라서 다른 HTML5 스펙과는 달리 클라이언트 코드만으로 실행 가능한 예를 만들 수는 없다

즉 클라이언트에서는 웹 소켓이 제공하는 자바스크립트 API를 이용해 서버에 연결하고 데이터를 송/수신하는 코드를 구현해야 하며 서버에서는 웹 소켓 프로토콜에 맞는 전용 장치가 구축되어 있어야 한다

웹 소켓 클라이언트
웹 소켓이 제공하는 클라이언트 측 API는 매우 심플하다. 기본적인 서버 연결, 데이터 송신, 데이터 수신만 정의하면 나머지는 일반적인 스크립트 로직일 뿐이다

서버연결

웹 소켓이 동작하기 위해서 제일 처음 서버와 연결이 되어야 한다. HTML5가 제공하는 WebSocket 객체를 통해 서버 연결을 수행한다. 일반 통신은 ws, 보안 통신은 wss 프로토콜을 이용한다

기본 포트 역시 http,https와 동일한 80,443을 이용한다
var wSocket = new WebSocket("ws://yourdomain/demo");

데이터 송신
서버와 연결이 되면 이제부터 데이터를 주고 받을 수 있게 된다. WebSocket 객체의 send 함수로 데이터를 서버로 송신할 수 있다
wSocket.send("송신 메시지");

데이터 수신
서버에서 푸시(전송)하는 데이터를 받으려면 message 이벤트를 구현하면 된다
wSocket.onmessage function(e){ //매개변수 e를 통해 수신된 데이터를 조회할 수 있다 

클라이언트 API는 이 세가지가 핵심이다. 추가로 아래와 같은 이벤트도 제공된다
open 이벤트: 연결이 설정되면 발생
close 이벤트: 연결이 끊어지면 발생


웹 소켓을 이용하는 클라이언트 코드의 전체 모습은 대략 다음과 같다

 

 

간단하게 HTML 파일을 생성해서 아래와 같이 작성하면 테스트를 진행하실 수 있습니다.

부가적으로 사용자의 요구에 맞게 연결(connect),종료(close),발신(Send),수신(Receive),로그(Log) 등 세부 기능을 추가하시면

더욱 이해가 잘 되실 거라 생각됩니다.

 

 

 

 

 

<!DOCTYPE html>

<meta charset="utf-8" />

<title>WebSocket 테스트</title>

<script language="javascript" type="text/javascript">

 

    var wsUri = "ws://echo.websocket.org/";

    var output;

 

    function init()

    {

        output = document.getElementById("output");

        testWebSocket();

    }

 

    function testWebSocket()

    {

        websocket = new WebSocket(wsUri);

        websocket.onopen = function(evt) { onOpen(evt) ;};

        websocket.onclose = function(evt) { onClose(evt) };

        websocket.onmessage = function(evt) { onMessage(evt) };

        websocket.onerror = function(evt) { onError(evt) };

    }

 

    function onOpen(evt)

    {

        writeToScreen("연결완료");

        doSend("테스트 메세지");

    }

 

    function onClose(evt)

    {

        writeToScreen("연결해제");

    }

 

    function onMessage(evt)

    {

        writeToScreen('<span style="color: blue;">수신: ' + evt.data+'</span>');

        websocket.close();

    }

 

    function onError(evt)

    {

        writeToScreen('<span style="color: red;">에러:</span> ' + evt.data);

    }

 

    function doSend(message)

    {

        writeToScreen("발신: " + message);

        websocket.send(message);

    }

 

    function writeToScreen(message)

    {

        var pre = document.createElement("p");

        pre.style.wordWrap = "break-word";

        pre.innerHTML = message;

        output.appendChild(pre);

    }

 

    window.addEventListener("load", init, false);

 

</script>

    <body>

        <h2>WebSocket Test</h2>

        <div id="output"></div>

    </body>

</html>

 

 

-----------

데이터 전송에 JSON 사용하기

JSON 을 사용하면 서버에 복잡한 데이터를 편리하게 보낼 수 있습니다. 예를 들어, 채팅 프로그램이 서버와 JSON으로 캡슐화된 패킷 데이터를 주고받는 프로토콜을 구현한것을 상상해 볼 수 있습니다.:

// Send text to all users through the server
function sendText() {
  // Construct a msg object containing the data the server needs to process the message from the chat client.
  var msg = {
    type: "message",
    text: document.getElementById("text").value,
    id:   clientID,
    date: Date.now()
  };

  // Send the msg object as a JSON-formatted string.
  websocket.send(JSON.stringify(msg));

  // Blank the text input element, ready to receive the next line of text from the user.
  document.getElementById("text").value = "";
}

JSON 오브젝트를 받아서 처리하기

상단의 데이터 전송에 JSON 사용하기 에서 작업한 코드와 연관되는 클라이언트를 생각해 봅시다. 클라이언트에서 받을 수 있는 패킷들의 목록은 다음과 같을 것 입니다.:

  • 로그인 핸드쉐이크
  • 메세지 텍스트
  • 유저 목록 업데이트

위의 메세지들을 받아서 처리하는 코드는 아래와 같을 것 입니다.:

exampleSocket.onmessage = function(event) {
  var f = document.getElementById("chatbox").contentDocument;
  var text = "";
  var msg = JSON.parse(event.data);
  var time = new Date(msg.date);
  var timeStr = time.toLocaleTimeString();

  switch(msg.type) {
    case "id":
      clientID = msg.id;
      setUsername();
      break;
    case "username":
      text = "<b>User <em>" + msg.name + "</em> signed in at " + timeStr + "</b><br>";
      break;
    case "message":
      text = "(" + timeStr + ") <b>" + msg.name + "</b>: " + msg.text + "<br>";
      break;
    case "rejectusername":
      text = "<b>Your username has been set to <em>" + msg.name + "</em> because the name you chose is in use.</b><br>"
      break;
    case "userlist":
      var ul = "";
      for (i=0; i < msg.users.length; i++) {
        ul += msg.users[i] + "<br>";
      }
      document.getElementById("userlistbox").innerHTML = ul;
      break;
  }

  if (text.length) {
    f.write(text);
    document.getElementById("chatbox").contentWindow.scrollByPages(1);
  }
};

 

번호 제목 글쓴이 날짜 조회 수
172 [자바스크립트] 성능을 높이는 코드 스타일 묵묵이 2022.04.14 0
» HTML5 WebSocket(웹 소켓) 기본 예제 및 설명 [1] 묵묵이 2022.04.09 1
170 아래 학폭과 관련하여... 혹 학폭과 관련하여 도움이 필요하신 묵묵이 2022.04.07 1
169 텍스트 및 이진 파일로 읽은 HTML5 파일 API 묵묵이 2022.03.25 19
168 자바스크립트로 자연스러운 슬라이드 만들기 묵묵이 2022.03.24 5
167 [투비소프트] VideoPlayer 비정상동작 관련 건 묵묵이 2022.03.14 2
166 HTML5 영상 플레이어 묵묵이 2022.03.09 5
165 Wireshark로 네트워크 지연 탐지 및 지.. 묵묵이 2021.12.07 4
164 아주가끔 아래아한글이 필요한 분들을 위한 아래아한글 사용법... 묵묵이 2021.11.18 5
163 전기주전자 석회질 제거 방법 묵묵이 2021.10.15 5
162 ios 클라이언트 push 기능 개발 묵묵이 2021.09.09 10
161 mi macbook pod install. 묵묵이 2021.09.04 5
160 [ios] Could not build Objective-C module 'Firebase' 묵묵이 2021.08.31 7
159 ios 에서 WebView를 사용 묵묵이 2021.08.21 6
158 mscomm32 시리얼통신 file 묵묵이 2021.08.05 8
157 크롬(chrome)에서 빠른 ajax(http, https) 요청이 계속 pending 현상 묵묵이 2021.07.17 6
156 Maven Repository 없이 로컬 jar 파일을 maven project 에 추가하는 방법 묵묵이 2021.06.07 6
155 MariaDB 날짜 함수 묵묵이 2021.05.27 7
154 Android 앱에 Firebase 추가 묵묵이 2021.05.15 6
153 Xcode12에서 시뮬레이터 빌드 오류 원인 및 해결방법 묵묵이 2021.05.14 6
위로