// 활성 연결 모두에 브로드캐스트합니다.
// 단, 자신에게 메시지 브로드캐스트는 피합니다.
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에 정의된 연결 해제 이벤트로 제공된 오류.