登录
首页 >  Golang >  Go问答

使用 Gorilla 将 Websocket 消息发送到指定的 Go 通道

来源:stackoverflow

时间:2024-02-26 17:36:25 487浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《使用 Gorilla 将 Websocket 消息发送到指定的 Go 通道》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

我对 go 很陌生,并且发现自己使用套接字作为我的第一个项目。这是一个多余的问题,但我无法理解如何将 websocket 更新发送到 go 中的特定通道(使用 gorilla)。

我正在使用此链接中的代码示例

这个方法。但未能修改为向特定频道发送消息。

这是我的示例代码 ma​​in.go

func main() {
    flag.parse()
    hub := newhub()
    go hub.run()
    http.handlefunc("/ws", func(w http.responsewriter, r *http.request) {
        fmt.println(hub)
        servews(hub, w, r)
    })
    err := http.listenandserve(*addr, nil)
    if err != nil {
        log.fatal("listenandserve: ", err)
    }
}

还有另外两个文件,名为 hub.go 和 client.go 我认为 hub.go 下面可以做一些事情

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

我应该从这里改变什么?

更新

我想做的是我有一个用 go 编写的套接字服务器。 现在假设我们有许多用 react 编写的客户端,它们在服务器上监听特定的 url,例如 wss://abc.com/wss1 或 wss://abc.com/wss2

现在,如果客户端 wss1 向服务器发送消息,服务器将向所有侦听 url wss1 而不是 wss2 的客户端发出此消息,反之亦然。

到目前为止,我已经能够向所有客户端进行广播,无论 wss1 或 wss2。 希望我说清楚了。


解决方案


要向 gorilla 聊天示例添加“频道”或“聊天室”功能,请执行以下操作。我将在此答案中使用“房间”一词,以避免与 go 通道混淆。

定义包含负载和房间标识符的消息类型:

type message struct {
   roomid string
   data []byte
}

将集线器广播通道替换为:

broadcast chan message

向客户端类型添加房间标识符:

type client struct {
    roomid string
    hub *hub
    ...
}

处理程序从 request URI 中提取房间标识符,并在创建 client 并发送 message 时设置房间标识符。

hubs clients 字段更改为由房间标识符键入的地图。初始化集线器时根据需要初始化此字段。

// registered clients by room
rooms map[string]map[*client]bool

更改 hub run 函数以处理房间。此代码在结构上与原始示例中的代码类似。

select {
    case client := <-h.register:
        room := h.rooms[client.roomID]
        if room == nil {
           // First client in the room, create a new one
           room = make(map[*Client]bool)
           h.rooms[client.roomID] = room
        }
        room[client] = true
    case client := <-h.unregister:
        room := h.rooms[client.roomID]
        if room != nil {
            if _, ok := room[client]; ok {
                delete(room, client)
                close(client.send)
                if len(room) == 0 {
                   // This was last client in the room, delete the room
                   delete(h.rooms, client.roomID)
                }
            }
         }
    case message := <-h.broadcast:
        room := h.rooms[message.roomID]
        if room != nil {
            for client := range room {
                select {
                case client.send <- message.data:
                default:
                    close(client.send)
                    delete(room, client)
                }
            }
            if len(room) == 0 {
                // The room was emptied while broadcasting to the room.  Delete the room.
                delete(h.rooms, message.roomID)
            }
        }
    }

到这里,我们也就讲完了《使用 Gorilla 将 Websocket 消息发送到指定的 Go 通道》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>