본문 바로가기
소프트웨어/파이썬

[파이썬] Websocket 통신서버 만들기

by 만들오 2021. 1. 23.

안녕하세요? 만들오 입니다.

 

파이썬으로 Websocket(웹소켓) 서버를 만들어 통신하는 예제를 공유합니다.

 

1. 필요한 패키지 설치

pip install simple_websocket_server

 

2. 파이썬 서버 작성

#server.py
from simple_websocket_server import WebSocketServer, WebSocket

class SimpleEcho(WebSocket):
    def handle(self):
        self.send_message(self.data)
        print(self.data)

    def connected(self):
        print(self.address, 'connected')

    def handle_close(self):
        print(self.address, 'closed')


server = WebSocketServer('localhost', 3000, SimpleEcho)
server.serve_forever()

localhost:3000 주소로 웹소켓 서버를 만들고 돌립니다.

 

3. html 파일

<!DOCTYPE html>
<html>

<body>
  <canvas id="joy" style="border:5px dashed #BDBDBD"></canvas>
  <script>
    let ws = new WebSocket("ws://localhost:3000"); //웹소켓 생성
    ws.onopen = function(){
      ws.send("Websocket is ready!");
    }
    var joy = document.getElementById("joy");
    joy.width = 200;
    joy.height = 200;
    joy.addEventListener("touchstart", down);
    joy.addEventListener("touchmove", move);
    joy.addEventListener("touchend", up);
    joy.addEventListener("mousedown", down);
    joy.addEventListener("mousemove", move);
    joy.addEventListener("mouseup", up);
    joy.addEventListener("mouseleave", up);
    var ctx = joy.getContext("2d");
    ctx.lineWidth = 10;
    clearBackground();
    drawCircle(100, 100, 50, "rgb(255,000,051)");
    var startX, startY, moveX, moveY;
    var joyPos = joy.getBoundingClientRect();
    var onTouch = false;
    function down(event) {
      try {
        startX = Math.round(event.touches[0].clientX - joyPos.left);
        startY = Math.round(event.touches[0].clientY - joyPos.top);
      } catch{
        startX = Math.round(event.clientX - joyPos.left);
        startY = Math.round(event.clientY - joyPos.top);
      }
      onTouch = true;
    }

    var moveMax = 40;
    var msgPrev = "s";
    var msg = "s";
    function move(event) {
      if (onTouch) {
        try {
          moveX = Math.round(event.touches[0].clientX - joyPos.left) - startX;
          moveY = Math.round(event.touches[0].clientY - joyPos.top) - startY;
        } catch{
          moveX = Math.round(event.clientX - joyPos.left) - startX;
          moveY = Math.round(event.clientY - joyPos.top) - startY;
        }

        if (moveX > moveMax) moveX = moveMax;
        else if (moveX < -moveMax) moveX = -moveMax;
        if (moveY > moveMax) moveY = moveMax;
        else if (moveY < -moveMax) moveY = -moveMax;

        clearBackground();
        drawCircle(100 + moveX, 100 + moveY, 50, "rgb(255,000,051)");

        if (moveX >= 35) msg = "d";
        else if (moveX <= -35) msg = "a";
        else if (moveY <= -35) msg = "w";
        else if (moveY >= 35) msg = "x";

        if (msg != msgPrev) {
          send(msg);
          msgPrev = msg;
        }
      }

    }

    function up() {
      clearBackground();
      drawCircle(100, 100, 50, "rgb(255,000,051)");
      msg = "s";
      msgPrev = "s";
      onTouch = false;
      send(msg);
    }

    function send(msg) {
      console.log(msg);
      ws.send(msg);
    }

    function clearBackground() {
      ctx.clearRect(0, 0, joy.width, joy.height);
      ctx.beginPath();
      ctx.strokeStyle = "rgb(153,000,051)";
      ctx.arc(100, 100, 90, 0, 2 * Math.PI);
      ctx.stroke();
    }

    function drawCircle(x, y, r, c) {
      ctx.beginPath();
      ctx.fillStyle = c;
      ctx.arc(x, y, r, 0, 2 * Math.PI);
      ctx.fill();
    }
  </script>
</body>

</html>

 

4. 동작 설명

파이썬을 이용해 localhost:3000 포트에 웹소켓 서버를 띄웠습니다.

 

클라이언트는 html 파일이며, 실행 시 위 웹소켓 주소로 접속해 실시간 통신을 시작합니다.

 

조이스틱을 움직임에 따라 파이썬 콘솔창에 메시지가 찍히도록 코딩했습니다.

 

* 이 글은 티스토리 카카오계정 연동정책으로 인해 이전 블로그(오코취) 글을 옮겨왔습니다.

[끝].

728x90

댓글