您如何在Go Chat应用中通过websocket有选择地向客户广播?

时间:2018-07-18 04:24:08

标签: go websocket server client chat

我已经使用Gowebsockets中构建了一个可运行的聊天应用程序。

我遇到的一个问题是,当用户编写一条消息时,该消息会广播到每个客户端,其中包括编写该消息的用户。

这将导致重复消息-但仅适用于正在编写该消息的作者。

您如何选择性地将传入的网络套接字广播给未编写邮件的客户?

我正在使用常见的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)
                }
            }
        }
    }
}

0 个答案:

没有答案