@Kagtaviy

Как правильно работать с gorilla/websocket?

Здравствуйте, помогите пожалуйста разобраться с gorilla/websocket.
Не понимаю как мне правильно с ним работать.
Вот что есть:

Создаём hub:
type Hub struct {
	clients map[*Client]bool
	broadcast chan []byte
	register chan *Client
	unregister chan *Client
}

func NewHub() *Hub {
	return &Hub{
		broadcast:  make(chan []byte),
		register:   make(chan *Client),
		unregister: make(chan *Client),
		clients:    make(map[*Client]bool),
	}
}

func Run(h *Hub) {
	for {
		select {
		case client := <-h.register:
			h.clients[client] = true
		case client := <-h.unregister:
			if _, ok := h.clients[client]; ok {
				delete(h.clients, client)
				close(client.send)
			}
			
		}
	}
}


В main.go:
hub := ws.NewHub()
go ws.Run(hub)
....
r.HandleFunc("/socket", func(w http.ResponseWriter, r *http.Request) {
		ws.ServeWs(hub, w, r)
	})


Client:
const (
	writeWait = 10 * time.Second
	pongWait = 60 * time.Second
	pingPeriod     = (pongWait * 9) / 10
	maxMessageSize = 512
)

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

type Client struct {
	hub *Hub
	conn *websocket.Conn
	send chan []byte
}

func ServeWs(hub *Hub, w http.ResponseWriter, r *http.Request) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println(err)
		return
	}
	client := &Client{hub: hub, conn: conn, send: make(chan []byte, 256)}
	client.hub.register <- client
}

Тут тоже все понятно, но что дальше?
Я так понимаю нужно играть в "ping/pong", но совсем не понимаю как мне это осуществить?
Так-же не понимаю как мне правильно отслеживать сообщения от клиента на стороне сервера и отвечать ему?
Подскажите пожалуйста:3
  • Вопрос задан
  • 1094 просмотра
Пригласить эксперта
Ответы на вопрос 2
mututunus
@mututunus
Backend developer (Python, Golang)
Можно глянуть https://github.com/onrik/wshub, это обертка над gorilla/websocket
Ответ написан
В функции ServeWs вы регистрируете клиента и сразу завершаете соединение с ним, выходя из этой функции.
Надо по-другому. Внутри ServeWs регистрируете клиента и в цикле читаете его сообщения и отправляете свои ему.

В грубом приближении, что-то такое:
func ServeWs(hub *Hub, w http.ResponseWriter, r *http.Request) {
	conn, err := wsupgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println(err)
		return
	}
	client := &Client{hub: hub, conn: conn, send: make(chan []byte, 256)}
	client.hub.register <- client

	for {
		var msg MsgType
		err := conn.ReadJSON(&msg)
		if err != nil {
			client.hub.unregister <- client
			return
		}
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час