【发布时间】:2019-06-14 20:27:20
【问题描述】:
我对 Go 非常陌生,并且发现自己使用套接字作为我的第一个项目。这是一个多余的问题,但我无法理解如何 向 Go 中的特定客户端发送 websocket 更新(使用 Gorilla)。
我要解决的广泛问题是 - 使用 websockets 和 ES/Lucene 等搜索引擎构建预输入。我在我的搜索引擎上维护了一堆索引,并且围绕它有一个 Go 包装器。当我开始在 Go 中使用 websockets 时,我发现了几乎所有显示广播机制的示例。当我试图深入研究这一点并尝试根据this 线程和此answer 中给出的示例修改大猩猩的github repo 中给出的示例时,我似乎不明白connections 以及如何适合client.go
理想情况下,我希望看到这个工作的方式是 -
- 客户端和服务器之间的套接字连接已建立
- 当客户端通过套接字发送输入时,服务器获取它并扔进一个通道(Go 通道)
- 索引包装器检查此通道,一旦有东西要获取,就会检索索引并将其写回套接字
服务器如何唯一标识Client?
我使用了 Gorilla 的 Github repo 上给出的示例
从我的代码库hub.go 有以下内容
type Hub struct {
// Registered clients.
clients map[*Client]bool
// Inbound messages from the clients.
broadcast chan []byte
// Register requests from the clients.
register chan *Client
// Unregister requests from clients.
unregister chan *Client
connections map[string]*connection
}
func newHub() *Hub {
return &Hub{
broadcast: make(chan []byte),
register: make(chan *Client),
unregister: make(chan *Client),
clients: make(map[*Client]bool),
connection: make(map[*Client]bool), // is this alright?
}
}
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.connections {
select {
case client.send <- message:
default:
close(client.send)
delete(h.connections, client)
}
}
}
}
}
我不确定我应该向client.go添加什么
type Client struct {
// unique ID for each client
// id string
// Hub object
hub *Hub
// The websocket connection.
conn *websocket.Conn
// Buffered channel of outbound messages.
send chan []byte
// connection --> (what should the connection property be?)
connection string
}
请注意 - 我将在 Client 结构中添加一个 Id 字段。我该如何从这里开始?
【问题讨论】:
-
问题是找到
*Client -
我应该在数据库中维护客户地图吗?
Client结构没有唯一标识客户端所需的东西吗? -
@ThunderCat 谢谢你的建议,希望这次编辑能让事情变得更清晰
-
啊,让我看一下那个例子。很快就会在这个线程上更新。谢谢@ThunderCat