Open j1mmyson opened 1 year ago
GET /ws/{paper_id}
// 프로토콜 체크 app.Use("/ws", func(c *fiber.Ctx) error { if websocket.IsWebSocketUpgrade(c) { return c.Next() } return fiber.ErrUpgradeRequired })
// 웹소켓 연결 app.Get("/ws/:paper_id", websocket.New(func(c *websocket.Conn) { paperID := c.Params("paper_id")
// 함수가 종료되면 웹소켓 연결 끊김 defer func() { c.Close() }()
doSomething() }))
2. `doSomething()`에서 해주어야 할 것? - 유저가 페이퍼 구독 - `map[string] []*websocket.Conn` - key = `papaer_id`, value = `array of websocket Connection` - 위 딕셔너리에 유저 커넥션 추가 ```go paperMap := make(map[string] []*websocket.Conn) paperID := c.Params("paper_id") val, exists := paperMap[paperID] if exists { paperMap[channelID] = append(val, c) } else { paperMap[channelID] = []*websocket.Conn{c} }
유저가 보내는 메시지 처리
for { _, msg, err := c.ReadMessage() if err != nil { // error 처리 } HandleMessage() // 미구현된 데이터 수신 부분
payload := GetDataFromRedis() // 미구현
// BroadCasting 구현부 for _, conn := range paperMap[channelID] { conn.WriteMessage(websocket.TextMessage, payload) }
}
- 레디스와 빈번한 통신 필요 - Redis Connection Pooling - or wss에서 in-memory db사용하는 방법
GET /ws/{paper_id}
요청을 보내면 프로토콜 확인 이후 웹소켓 연결.// 웹소켓 연결 app.Get("/ws/:paper_id", websocket.New(func(c *websocket.Conn) { paperID := c.Params("paper_id")
// 함수가 종료되면 웹소켓 연결 끊김 defer func() { c.Close() }()
doSomething() }))
유저가 보내는 메시지 처리
payload := GetDataFromRedis() // 미구현
// BroadCasting 구현부 for _, conn := range paperMap[channelID] { conn.WriteMessage(websocket.TextMessage, payload) }
}