我已经使用Go
在websockets
中构建了一个可运行的聊天应用程序。
我遇到的一个问题是,当用户编写一条消息时,该消息会广播到每个客户端,其中包括编写该消息的用户。
这将导致重复消息-但仅适用于正在编写该消息的作者。
您如何选择性地将传入的网络套接字广播给未编写邮件的客户?
我正在使用常见的go design pattern
聊天/网络套接字,主要取自gorilla/mux
文档:
hub.go
package main
import "log"
// Hub broadcasts messages to active clients
type Hub struct {
clients map[*Client]bool // registered clients.
broadcast chan []byte // inbound client messages
register chan *Client // register client requests
unregister chan *Client // unregister client requests.
}
func newHub() *Hub {
return &Hub{
broadcast: make(chan []byte),
register: make(chan *Client),
unregister: make(chan *Client),
clients: make(map[*Client]bool),
}
}
func (h *Hub) run() {
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)
}
case message := <-h.broadcast:
for client := range h.clients {
select {
case client.send <- message:
// skip author of message here
default:
close(client.send)
delete(h.clients, client)
}
}
}
}
}