Go Fiber 한글 공식 문서
  • 🙇‍♀️안녕하세요
  • 🏠Home
    • 👋Welcome
    • 📁API
      • 📦Fiber
      • 🚀App
      • 🧠Ctx
      • 📋Constants
      • 🌎Client
      • 📃Log
      • 🧬Middleware
        • Adaptor
        • BasicAuth
        • Cache
        • Compress
        • CORS
        • CSRF
        • EarlyData
        • Encrypt Cookie
        • EnvVar
        • ETag
        • ExpVar
        • Favicon
        • FileSystem
        • Health Check
        • Helmet
        • Idempotency
        • Keyauth
        • Limiter
        • Logger
        • Monitor
        • Pprof
        • Proxy
        • Recover
        • Redirect
        • RequestID
        • Rewrite
        • Session
        • Skip
        • Timeout
    • 📁Guide
      • 🔌Routing
      • 🎭Grouping
      • 📝Templates
      • 🐛Error Handling
      • 🔎Validation
      • 🎣Hooks
      • ⚡Make Fiber Faster
    • 📁Extra
      • 🤔FAQ
      • 📊Benchmarks
  • 🧩Extra
    • 🧬Contrip
      • 👋Welcome
      • Casbin
      • Fgprof
      • Fiberi18n
      • Fibernewrelic
      • Fibersentry
      • Fiberzap
      • Fiberzerolog
      • JWT
      • LoadShed
      • Opafiber
      • Otelfiber
        • Example
      • Paseto
      • README
      • Swagger
      • Websocket
    • 📦Storage
      • 👋Welcome
      • ArangoDB
      • Azure Blob
      • Badger
      • Bbolt
      • Coherence
      • Couchbase
      • DynamoDB
      • Etcd
      • Memcache
      • Memory
      • Minio
      • MongoDB
      • MSSQL
      • MySQL
      • Nats
      • Pebble
      • Postgres
      • Redis
      • Ristretto
      • Rueidis
      • S3
      • ScyllaDb
      • SQLite3
    • 📃Template
      • 👋Welcome
      • Ace
      • Amber
      • Django
      • Handlebars
      • HTML
        • Golang Templates Cheatsheet
      • Jet
      • Mustache
      • Pug
      • Slim
Powered by GitBook
On this page
  • Socket.io
  • Installation
  • Signatures
  • Examples
  • 지원되는 이벤트
  • 이벤트 페이로드 객체
  • 소켓 인스턴스 함수
  1. Extra
  2. Contrip

README

PreviousPasetoNextSwagger

Last updated 1 year ago


Socket.io

참고: Go 1.20 이상 필요

Installation

go get -u github.com/gofiber/fiber/v2
go get -u github.com/gofiber/contrib/socketio

Signatures

// 콜백에서 새 socketio를 초기화하면 *Websocket 객체를 예상하는 콜백이 실행됩니다.
func New(callback func(kws *Websocket)) func(*fiber.Ctx) error
// 이벤트에 대한 리스너 콜백을 listeners 목록에 추가합니다.
func On(event string, callback func(payload *EventPayload))
// 특정 소켓 UUID 목록에 메시지를 전송합니다.
// 모든 오류를 무시합니다.
func EmitToList(uuids []string, message []byte)
// 특정 소켓 연결에 전송합니다.
func EmitTo(uuid string, message []byte) error
// 활성 연결 모두에 브로드캐스트합니다.
// 단, 자신에게 메시지 브로드캐스트는 피합니다.
func Broadcast(message []byte) 
// 모든 연결에 사용자 지정 이벤트를 실행합니다.
func Fire(event string, data []byte)

Examples

package main

import (
    "encoding/json"
    "fmt"
    "log"

    "github.com/gofiber/contrib/socketio"
    "github.com/gofiber/contrib/websocket"  
    "github.com/gofiber/fiber/v2"
)

// MessageObject 기본 채팅 메시지 객체
type MessageObject struct {
    Data  string `json:"data"`  
    From  string `json:"from"`
    Event string `json:"event"`
    To    string `json:"to"`  
}

func main() {

    // 맵의 키는 message.to입니다.
    clients := make(map[string]string)

    // 새 Fiber 애플리케이션 시작
    app := fiber.New()

    // 첫 번째 GET 요청으로 전송된 데이터를 검색하기 위한 미들웨어 설정
    app.Use(func(c *fiber.Ctx) error {
        // IsWebSocketUpgrade는 클라이언트가 WebSocket 프로토콜로 
        // 업그레이드를 요청한 경우 true를 반환합니다.
        if websocket.IsWebSocketUpgrade(c) {
            c.Locals("allowed", true)
            return c.Next()
        }
        return fiber.ErrUpgradeRequired
    })

    // 다중 이벤트 처리 지원
    socketio.On(socketio.EventConnect, func(ep *socketio.EventPayload) {
        fmt.Println(fmt.Sprintf("Connection event 1 - User: %s", ep.Kws.GetStringAttribute("user_id")))
    })

    // 사용자 지정 이벤트 처리 지원  
    socketio.On("CUSTOM_EVENT", func(ep *socketio.EventPayload) {
        fmt.Println(fmt.Sprintf("Custom event - User: %s", ep.Kws.GetStringAttribute("user_id")))
        // --->

        // 여기서 비즈니스 로직을 수행하세요.

        // --->
    })

    // 메시지 이벤트에서  
    socketio.On(socketio.EventMessage, func(ep *socketio.EventPayload) {

        fmt.Println(fmt.Sprintf("Message event - User: %s - Message: %s", ep.Kws.GetStringAttribute("user_id"), string(ep.Data)))

        message := MessageObject{}

        // JSON 메시지 언마샬링
        // {
        //  "from": "<user-id>",
        //  "to": "<recipient-user-id>",
        //  "event": "CUSTOM_EVENT",  
        //  "data": "hello"
        //}
        err := json.Unmarshal(ep.Data, &message)
        if err != nil {
            fmt.Println(err)
            return  
        }

        // 일부 비즈니스 로직에 따라 사용자 지정 이벤트 실행
        if message.Event != "" {
            ep.Kws.Fire(message.Event, []byte(message.Data))
        }

        // 지정된 사용자에게 메시지를 직접 전송
        err = ep.Kws.EmitTo(clients[message.To], ep.Data, socketio.TextMessage)
        if err != nil {  
            fmt.Println(err)
        }
    })

    // 연결 해제 이벤트에서
    socketio.On(socketio.EventDisconnect, func(ep *socketio.EventPayload) {
        // 로컬 클라이언트에서 사용자 제거
        delete(clients, ep.Kws.GetStringAttribute("user_id"))
        fmt.Println(fmt.Sprintf("Disconnection event - User: %s", ep.Kws.GetStringAttribute("user_id")))
    })

    // 닫기 이벤트에서  
    // 이 이벤트는 서버가 .Close() 메서드로 사용자를 능동적으로 연결 해제할 때 호출됩니다.
    socketio.On(socketio.EventClose, func(ep *socketio.EventPayload) {
        // 로컬 클라이언트에서 사용자 제거
        delete(clients, ep.Kws.GetStringAttribute("user_id"))
        fmt.Println(fmt.Sprintf("Close event - User: %s", ep.Kws.GetStringAttribute("user_id")))
    })

    // 오류 이벤트에서
    socketio.On(socketio.EventError, func(ep *socketio.EventPayload) {  
        fmt.Println(fmt.Sprintf("Error event - User: %s", ep.Kws.GetStringAttribute("user_id")))
    })

    app.Get("/ws/:id", socketio.New(func(kws *socketio.Websocket) {

        // 엔드포인트에서 사용자 ID 검색
        userId := kws.Params("id")

        // 연결된 클라이언트 목록에 연결 추가
        // UUID는 임의로 생성되며 socketio가 Emit/EmitTo/Broadcast를 관리할 수 있게 해주는 키입니다.  
        clients[userId] = kws.UUID

        // 모든 웹소켓 연결에는 선택적 세션 키 => 값 저장소가 있습니다.
        kws.SetAttribute("user_id", userId)

        // 연결된 모든 사용자에게 새로 들어온 사람 브로드캐스트
        kws.Broadcast([]byte(fmt.Sprintf("New user connected: %s and UUID: %s", userId, kws.UUID)), true, socketio.TextMessage)
        // 환영 메시지 작성
        kws.Emit([]byte(fmt.Sprintf("Hello user: %s with UUID: %s", userId, kws.UUID)), socketio.TextMessage)  
    }))

    log.Fatal(app.Listen(":3000"))
}

지원되는 이벤트

상수
이벤트
설명

EventMessage

message

텍스트/바이너리 메시지가 수신되면 실행됩니다.

EventPing

ping

EventPong

pong

ping 설명 참조

EventDisconnect

disconnect

연결 해제 시 실행됩니다. RFC 6455 섹션 11.7에 정의된 연결 해제 이벤트로 제공된 오류.

EventConnect

connect

첫 번째 연결 시 실행됩니다.

EventClose

close

서버에서 연결이 능동적으로 닫힐 때 실행됩니다. 클라이언트 연결 해제와 다릅니다.

EventError

error

일부 오류가 나타날 때 실행되며 웹소켓 디버깅에도 유용합니다.

이벤트 페이로드 객체

변수
유형
설명

Kws

*Websocket

연결 객체

Name

string

이벤트 이름

SocketUUID

string

고유한 연결 UUID

SocketAttributes

map[string]string

선택적 웹소켓 속성

Error

error

(선택 사항) 연결 해제 또는 오류 이벤트에서 실행됨

Data

[]byte

Message 및 Error 이벤트에 사용되는 데이터, 사용자 지정 이벤트용 페이로드

소켓 인스턴스 함수

이름
유형
설명

SetAttribute

void

특정 소켓 연결에 대한 특정 속성 설정

GetUUID

string

소켓 연결 UUID 가져오기

SetUUID

error

소켓 연결 UUID 설정

GetAttribute

string

소켓 속성에서 특정 속성 가져오기

EmitToList

void

특정 소켓 UUID 목록에 메시지 전송

EmitTo

error

특정 소켓 연결에 전송

Broadcast

void

활성 연결 모두에 브로드캐스트하되 자신에게 메시지 브로드캐스트 제외

Fire

void

사용자 지정 이벤트 실행

Emit

void

주어진 연결로 메시지 전송/쓰기

Close

void

서버에서 능동적으로 연결 닫기

참고: FastHTTP 연결은 인스턴스에서 직접 액세스할 수 있습니다.

kws.Conn

용 이벤트 지원이 포함된 WebSocket 래퍼이며 에서 영감을 받았습니다.

🧩
🧬
Fiber
Socket.io
여기에서 자세한 내용