[go] net/http 패키지를 사용한 웹 소켓 통신 구현

웹 소켓(WebSocket)은 웹 애플리케이션이 서버와 양방향 통신을 할 수 있게 해주는 기술입니다. Go 언어에서는 net/http 패키지를 활용하여 웹 소켓 통신을 구현할 수 있습니다. 이번 글에서는 net/http 패키지를 사용하여 간단한 웹 소켓 통신을 구현하는 방법에 대해 알아보겠습니다.

1. 웹 소켓 핸들러 등록

먼저, 웹 소켓 통신을 하기 위해 net/http 패키지를 사용하여 서버를 구현합니다. 이때 http 패키지의 HandleFunc 함수를 사용하여 웹 소켓 업그레이드 요청을 처리하는 핸들러를 등록합니다.

package main

import (
	"net/http"

	"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
	ReadBufferSize:  1024,
	WriteBufferSize: 1024,
}

func websocketHandler(w http.ResponseWriter, r *http.Request) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		// 에러 처리
		return
	}
	defer conn.Close()

	// 웹 소켓 연결 처리
}

위 코드에서 websocketHandler 함수는 웹 소켓 연결 요청을 처리하며, upgrader를 사용하여 HTTP 연결을 웹 소켓 연결로 업그레이드합니다.

2. 웹 소켓 연결 처리

웹 소켓 연결이 성공하면, 연결된 클라이언트와 서버 간의 양방향 통신을 구현할 수 있습니다. 아래의 코드는 웹 소켓 연결이 성공했을 때 메시지를 읽고 다시 클라이언트로 메시지를 보내는 예제입니다.

func websocketHandler(w http.ResponseWriter, r *http.Request) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		// 에러 처리
		return
	}
	defer conn.Close()

	for {
		messageType, p, err := conn.ReadMessage()
		if err != nil {
			// 에러 처리
			break
		}
		if err := conn.WriteMessage(messageType, p); err != nil {
			// 에러 처리
			break
		}
	}
}

3. 웹 소켓 클라이언트 구현

웹 소켓 클라이언트를 구현하여 서버와 통신할 수 있습니다. 다음은 github.com/gorilla/websocket 패키지를 사용한 웹 소켓 클라이언트의 예제 코드입니다.

package main

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

func main() {
	u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
	c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
	if err != nil {
		// 에러 처리
	}
	defer c.Close()

	done := make(chan struct{})

	go func() {
		defer close(done)
		for {
			_, message, err := c.ReadMessage()
			if err != nil {
				// 에러 처리
				return
			}
			fmt.Println(string(message))
		}
	}()

	err = c.WriteMessage(websocket.TextMessage, []byte("Hello, WebSocket!"))
	if err != nil {
		// 에러 처리
		return
	}

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

	for {
		select {
		case <-done:
			return
		case <-interrupt:
			// 연결 종료 처리
			return
		}
	}
}

위 코드는 웹 소켓 클라이언트를 구현한 예제로, 서버와 연결하여 메시지를 송수신할 수 있습니다.

4. 마치며

이번 글에서는 Go 언어의 net/http 패키지를 사용하여 간단한 웹 소켓 통신을 구현하는 방법에 대해 알아보았습니다. 웹 소켓을 통해 실시간 양방향 통신을 구현할 수 있으며, 필요에 따라 보안을 강화하거나 메시지 형식을 정의할 수 있습니다. 웹 소켓을 통해 더 실시간적인 웹 애플리케이션을 개발할 수 있습니다.

참고문헌: