[go] Go 언어에서 웹소켓 통신을 하는 방법

웹소켓(WebSocket)은 양방향 통신을 지원하는 프로토콜로, 클라이언트와 서버 간에 실시간 데이터를 주고받을 수 있습니다. Go 언어에서 웹소켓 통신을 구현하는 방법을 알아보겠습니다.

웹소켓 라이브러리 설치

Go 언어에서 웹소켓을 사용하기 위해서는 gorilla/websocket 패키지를 설치해야 합니다. 아래 명령을 사용하여 패키지를 설치합니다.

go get github.com/gorilla/websocket

웹소켓 서버 구현

아래는 Go 언어를 사용하여 웹소켓 서버를 구현하는 간단한 예제입니다.

package main

import (
    "log"
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

func handleWebSocket(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()

    for {
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            log.Println(err)
            return
        }
        if err := conn.WriteMessage(messageType, p); err != nil {
            log.Println(err)
            return
        }
    }
}

func main() {
    http.HandleFunc("/ws", handleWebSocket)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

위 예제는 gorilla/websocket 패키지를 사용하여 웹소켓 서버를 구현한 것입니다.

웹소켓 클라이언트 구현

웹소켓 클라이언트도 Go 언어로 간단하게 구현할 수 있습니다. 아래는 웹소켓 클라이언트의 예제입니다.

package main

import (
    "fmt"
    "github.com/gorilla/websocket"
    "log"
    "net/url"
    "os"
    "os/signal"
    "time"
)

func main() {
    interrupt := make(chan os.Signal, 1)
    signal.Notify(interrupt, os.Interrupt)

    u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
    log.Printf("connecting to %s", u.String())

    c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    defer c.Close()

    done := make(chan struct{})

    go func() {
        defer close(done)
        for {
            _, message, err := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                return
            }
            log.Printf("recv: %s", message)
        }
    }()

    ticker := time.NewTicker(time.Second)
    defer ticker.Stop()

    for {
        select {
        case <-done:
            return
        case t := <-ticker.C:
            err := c.WriteMessage(websocket.TextMessage, []byte(t.String()))
            if err != nil {
                log.Println("write:", err)
                return
            }
        case <-interrupt:
            log.Println("interrupt")
            err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
            if err != nil {
                log.Println("write close:", err)
                return
            }
            select {
            case <-done:
            case <-time.After(time.Second):
            }
            return
        }
    }
}

위 예제는 웹소켓 클라이언트를 구현한 것으로, 서버와의 연결, 데이터 수신, 송신, 연결 종료 등의 동작을 수행합니다.

이렇게 간단한 예제를 통해 Go 언어에서의 웹소켓 통신 구현 방법을 알아보았습니다.

Internal links: gorilla/websocket


본 문서는 Gorilla Web Toolkit의 웹소켓 패키지를 기반으로 작성되었습니다.