Пример чата показывает, как реализовать трансляцию.Пример чата не является хорошей отправной точкой для приложения, если широковещательная рассылка не требуется.
Чтобы отправить сообщение на определенное соединение через веб-сокет, просто напишите в соединение, используя NextWriter или WriteMessage .Эти методы не поддерживают одновременные записи, поэтому вам может потребоваться использовать мьютекс или групповую процедуру для обеспечения единственной записи.
Простой способ найти конкретный *websocket.Connection
состоит в передаче *websocket.Connection
коду, которыйэто нужноЕсли приложению необходимо связать другое состояние с соединением, определите тип для хранения этого состояния и передайте указатель на него:
type Client struct {
conn *websocket.Conn
mu sync.Mutex
...
}
Hub
можно изменить, чтобы отправлять сообщения определенному соединению, но это обходной путь, если трансляция не нужна.Вот как это сделать:
Добавить поле идентификатора к клиенту:
ID idType // replace idType with int, string, or whatever you want to use
Изменить поле концентратора Gorilla с connections map[*connection]bool
на connections map[idType]*connection
.
Определить сообщениетип, содержащий данные сообщения и идентификатор целевого клиента:
type message struct {
idType ID
data []byte
}
Замените поле широковещания концентратора на:
send chan message
Измените концентратор для цикла на:
for {
select {
case client := <-h.register:
h.clients[client.ID] = client
case client := <-h.unregister:
if _, ok := h.clients[client.ID]; ok {
delete(h.clients, client.ID)
close(client.send)
}
case message := <-h.send:
if client, ok := h.clients[message.ID]; ok {
select {
case client.send <- message.data:
default:
close(client.send)
delete(h.connections, client)
}
}
}
Отправляйте сообщения определенному клиенту, создав message
с соответствующим идентификатором:
hub.send <- message{ID: targetID, data: data}