> 백엔드 개발 > Golang > WebSocket을 사용한 실시간 웹 애플리케이션 데모 - 백엔드

WebSocket을 사용한 실시간 웹 애플리케이션 데모 - 백엔드

Patricia Arquette
풀어 주다: 2024-12-30 11:52:14
원래의
1014명이 탐색했습니다.

Real-Time Web Application demo with WebSocket - Backend

소개

이 기사에서는 실시간 WebSocket 애플리케이션의 백엔드 구현을 살펴보겠습니다. Gin 및 Go를 사용하여 구축된 백엔드는 WebSocket 연결을 효율적으로 관리하고, 메시지를 저장하며, 연결된 모든 클라이언트에 업데이트를 브로드캐스트합니다.


프로젝트 구조

https://github.com/tom-takeru/web-socket-demo

제 백엔드 프로젝트는 모듈성과 재사용성을 보장하도록 구성되었습니다. 다음은 업데이트된 디렉토리 구조입니다:

./backend
├── go.mod
├── go.sum
├── main.go
└── stores
    └── messages.go
로그인 후 복사

주요 디렉터리 및 파일

  • go.mod: 모듈 종속성과 버전을 정의합니다.
  • main.go: WebSocket 서버를 초기화하고 경로를 지정하는 애플리케이션의 진입점입니다.
  • stores/messages.go: 스레드로부터 안전한 작업으로 메시지 저장소를 관리합니다.

핵심 구성 요소: main.go

main.go는 WebSocket 서버 애플리케이션의 주요 진입점입니다. Gin 라우터를 설정하고 WebSocket 경로를 정의하며 WebSocket 수명 주기를 처리합니다.

코드 연습

package main

import (
    "encoding/json"
    "net/http"
    "sync"
    "time"

    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"

    "github.com/tom-takeru/web-socket-demo/backend/stores"
)

var (
    upgrader = websocket.Upgrader{
        CheckOrigin: func(r *http.Request) bool {
            origin := r.Header.Get("Origin")
            // NOTE: This project is for local development only.
            return origin == "http://localhost:3000"
        },
    }
    messageStore = stores.NewMessageStore()
    clients      = make(map[*websocket.Conn]bool)
    clientsMu    sync.Mutex
)

func handleWebSocket(c *gin.Context) {
    conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
    if err != nil {
        c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to upgrade to WebSocket"})
        return
    }
    defer conn.Close()

    clientsMu.Lock()
    clients[conn] = true
    clientsMu.Unlock()

    // Send existing messages to the new connection
    for _, msg := range messageStore.MarshalMessages() {
        conn.WriteMessage(websocket.TextMessage, msg)
    }

    for {
        _, message, err := conn.ReadMessage()
        if err != nil {
            break
        }

        var msgData map[string]string
        if err := json.Unmarshal(message, &msgData); err != nil {
            break
        }

        timestamp := time.Now().Format(time.RFC3339)
        msgData["timestamp"] = timestamp

        messageStore.AddMessage(msgData)

        modifiedMessage, err := json.Marshal(msgData)
        if err != nil {
            break
        }

        clientsMu.Lock()
        for client := range clients {
            if err := client.WriteMessage(websocket.TextMessage, modifiedMessage); err != nil {
                client.Close()
                delete(clients, client)
            }
        }
        clientsMu.Unlock()
    }

    clientsMu.Lock()
    delete(clients, conn)
    clientsMu.Unlock()
}

func main() {
    r := gin.Default()
    r.GET("/ws", handleWebSocket)
    r.Run("localhost:8080")
}
로그인 후 복사

주요 기능

  1. 상태 관리: 연결된 클라이언트를 추적하고 뮤텍스를 사용하여 스레드로부터 안전한 액세스를 보장합니다.
  2. WebSocket 수명 주기: 연결 설정, 메시지 브로드캐스트 및 연결 끊김 정리를 처리합니다.

결론

WebSocket 데모 애플리케이션의 백엔드 구현에서는 Gin 및 Go를 사용하여 실시간 통신을 효과적으로 관리하는 방법을 보여줍니다. 지속적인 연결과 스레드로부터 안전한 메시지 저장소를 위해 WebSocket을 활용함으로써 이 애플리케이션은 실시간 웹 애플리케이션 구축을 위한 강력한 기반 역할을 합니다.

다음 글에서는 배포 전략과 WebSocket 성능 최적화에 대해 논의하겠습니다.


시리즈 링크

  • WebSocket을 사용한 실시간 웹 애플리케이션 데모 - 개요
  • WebSocket을 사용한 실시간 웹 애플리케이션 데모 - 프런트엔드

위 내용은 WebSocket을 사용한 실시간 웹 애플리케이션 데모 - 백엔드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿