返回顶部
首页 > 资讯 > 服务器 >Golang 服务器向每个用户发送的事件
  • 230
分享到

Golang 服务器向每个用户发送的事件

2024-02-06 13:02:38 230人浏览 八月长安
摘要

问题内容 我使用 Go 已经有一段时间了,但之前从未使用过 SSE。我遇到了一个问题,有人可以提供一个仅发送给特定用户(连接)的服务器发送事件的工作示例吗? 我正在使用 gorilla

问题内容

我使用 Go 已经有一段时间了,但之前从未使用过 SSE。我遇到了一个问题,有人可以提供一个仅发送给特定用户(连接)的服务器发送事件的工作示例吗?

我正在使用 gorilla - 会话进行身份验证,并且我想使用 UserID 来分隔连接。

或者我应该通过 ajax 使用 5 秒轮询?

非常感谢

这是我发现并尝试过的:

  1. https://GISt.GitHub.com/ismasan/3fb75381cd2deb6bfa9c 它不会发送给个人用户,并且如果连接关闭,go func 也不会停止

  2. Https://github.com/striversity/gotr/blob/master/010-server-sent-event-part-2/main.go 这正是我所需要的,但一旦连接被删除。所以现在,一旦您在私人窗口中关闭并打开浏览器,它就根本无法工作。另外,如上所述,Go 例程继续进行。


正确答案


创建一个“代理”来将消息分发给连接的用户:

type broker struct {
    // users is a map where the key is the user id
    // and the value is a slice of channels to connections
    // for that user id
    users map[string][]chan []byte

    // actions is a channel of functions to call
    // in the broker's goroutine. the broker executes
    // everything in that single goroutine to avoid
    // data races.
    actions chan func()
}

// run executes in a goroutine. it simply gets and 
// calls functions.
func (b *broker) run() {
    for a := range b.actions {
        a()
    }
}

func newbroker() *broker {
    b := &broker{
        users:   make(map[string][]chan []byte),
        actions: make(chan func()),
    }
    go b.run()
    return b
}

// adduserchan adds a channel for user with given id.
func (b *broker) adduserchan(id string, ch chan []byte) {
    b.actions <- func() {
        b.users[id] = append(b.users[id], ch)
    }
}

// removeuserchan removes a channel for a user with the given id.
func (b *broker) removeuserchan(id string, ch chan []byte) {
    // the broker may be trying to send to 
    // ch, but nothing is receiving. pump ch
    // to prevent broker from getting stuck.
    go func() { for range ch {} }()

    b.actions <- func() {
        chs := b.users[id]
        i := 0
        for _, c := range chs {
            if c != ch {
                chs[i] = c
                i = i + 1
            }
        }
        if i == 0 {
            delete(b.users, id)
        } else {
            b.users[id] = chs[:i]
        }
        // close channel to break loop at beginning
        // of removeuserchan.
        // this must be done in broker goroutine
        // to ensure that broker does not send to
        // closed goroutine.
        close(ch)
    }
}

// sendtouser sends a message to all channels for the given user id.
func (b *broker) sendtouser(id string, data []byte) {
    b.actions <- func() {
        for _, ch := range b.users[id] {
            ch <- data
        }
    }
}

在包级别使用代理声明变量:

var broker = newbroker()

使用代理编写 sse 端点:

func sseEndpoint(w http.ResponseWriter, r *http.Request) {
    // I assume that user id is in query string for this example,
    // You should use your authentication code to get the id.
    id := r.FORMValue("id")

    // Do the usual SSE setup.
    flusher := w.(http.Flusher)
    w.Header().Set("Content-Type", "text/event-stream")
    w.Header().Set("Cache-Control", "no-cache")
    w.Header().Set("Connection", "keep-alive")

    // Create channel to receive messages for this connection.  
    // Register that channel with the broker.
    // On return from the function, remove the channel
    // from the broker.
    ch := make(chan []byte)
    broker.addUserChan(id, ch)
    defer broker.removeUserChan(id, ch)
    for {
        select {
        case <-r.Context().Done():
            // User closed the connection. We are out of here.
            return
        case m := <-ch:
            // We got a message. Do the usual SSE stuff.
            fmt.Fprintf(w, "data: %s\n\n", m)
            flusher.Flush()
        }
    }
}

向您的应用程序添加代码以调用 broker.sendtouser。

以上就是golang 服务器向每个用户发送的事件的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Golang 服务器向每个用户发送的事件

本文链接: https://lsjlt.com/news/561501.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Golang 服务器向每个用户发送的事件
    问题内容 我使用 Go 已经有一段时间了,但之前从未使用过 SSE。我遇到了一个问题,有人可以提供一个仅发送给特定用户(连接)的服务器发送事件的工作示例吗? 我正在使用 gorilla...
    99+
    2024-02-06
  • 使用curl向Golang服务器发送数组
    来到编程网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《使用curl向Golang服务器发送数组》,介绍一下,希望对大家的知识积累有所帮助,助力...
    99+
    2024-04-05
  • 向腾讯云服务器发送文件怎么发送
    如果您想向腾讯云服务器发送文件,您可以按照以下步骤操作: 打开腾讯云服务器的客户端(例如 ChatGPT Client)。 选择您要发送的文件,并输入接收方的 URL。 如果您需要向接收方发送消息,则可以在文件名称下方输入消息文本。 点...
    99+
    2023-10-27
    腾讯 服务器 文件
  • 向腾讯云服务器发送文件
    如果您要向腾讯云服务器发送文件,请按照以下步骤操作: 在本地计算机上打开腾讯云服务器,并登录到其账户; 在控制台中,选择“服务器管理”选项,并点击“服务器配置”按钮; 在服务器配置页面中,您可以找到以下选项: 选择您要将文件上传的文...
    99+
    2023-10-26
    腾讯 服务器 文件
  • 向腾讯云服务器发送文件怎么发送不了
    其次,你需要检查你的邮箱是否开启SMTP服务,确保你使用的邮箱是开启SMTP服务的。你可以在腾讯通RTX管理器中打开配置向导-服务器允许状态,停止所有服务,然后在服务停止后,打开腾讯通安装目录内的设置文件,检查邮箱是否开启SMTP服务。 ...
    99+
    2023-10-27
    腾讯 服务器 文件
  • MQTT协议-发布消息(服务器向客户端发送)
    MQTT协议-发布消息(服务器向客户端发送) 发布消息报文组成:https://blog.csdn.net/weixin_46251230/article/details/129414158 在了解了...
    99+
    2023-09-22
    阿里云 MQTT协议
  • 向腾讯云服务器发送文件怎么发
    如果您想向腾讯云服务器发送文件,可以按照以下步骤操作: 在本地计算机上打开腾讯云服务器,并登录账户。 在“工具”菜单中选择“文件共享”。 在弹出的对话框中选择“创建新的工作簿”。 在弹出的新工作簿对话框中,填写您要在服务器上传送的文件的...
    99+
    2023-10-27
    腾讯 服务器 文件
  • HTML5服务器发送事件实例分析
    本篇内容介绍了“HTML5服务器发送事件实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! &nbs...
    99+
    2024-04-02
  • 向腾讯云服务器发送文件怎么发不出去
    确认网络连接是否稳定:当您在向腾讯云服务器发送文件时,您需要确保您的网络连接稳定,否则可能会导致文件无法正常发送。如果您的网络连接不稳定,您可以尝试使用其他网络连接来尝试发送文件。 检查网络配置是否正确:如果您的网络配置不正确,可能会导致...
    99+
    2023-10-27
    腾讯 不出去 服务器
  • 向腾讯云服务器发送文件失败原因
    首先,了解文件发送失败的原因非常重要。一般来说,有以下几种可能导致文件发送失败: 文件路径错误。文件路径是指发送文件的文件夹所在的位置,如果路径有误,那么发送文件就会失败。 网络问题。网络不好或者服务器故障等原因,也会导致文件发送失败。...
    99+
    2023-10-28
    腾讯 原因 服务器
  • 如何使用ajax向服务器发送数据
    这篇文章主要为大家展示了“如何使用ajax向服务器发送数据”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用ajax向服务器发送数据”这篇文章吧。1. 准备...
    99+
    2024-04-02
  • html5之sse服务器发送事件EventSource的示例分析
    这篇文章主要介绍html5之sse服务器发送事件EventSource的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Server-Sent Events使用Server-S...
    99+
    2024-04-02
  • Android使用httpPost向服务器发送请求的方法
    本文实例讲述了Android使用httpPost向服务器发送请求的方法。分享给大家供大家参考,具体如下: import java.util.List; import org....
    99+
    2022-06-06
    服务器 方法 Android
  • 向腾讯云服务器发送文件失败怎么办
    1. 检查网络连接 如果向腾讯云服务器发送文件失败,首先要检查您的网络连接是否正常。确保您的计算机或设备已连接到互联网,并且网络连接稳定。您可以尝试访问其他网站或使用其他网络应用程序来确认网络连接是否正常。 2. 检查服务器配置 确保您的...
    99+
    2023-10-27
    腾讯 服务器 文件
  • 如何向阿里云服务器发送文件到邮箱
    这篇文章将详细介绍如何向阿里云服务器发送文件到邮箱。阿里云服务器是阿里云提供的一种高性能、高可用的计算服务,可以满足各种复杂的业务需求。发送文件到邮箱是一种常见的文件传输方式,阿里云服务器支持这一功能,使得用户可以方便地将文件发送到阿里云服...
    99+
    2023-12-14
    阿里 邮箱 服务器
  • Android使用Retrofit2向服务器发送Application/Json请求
    1.添加APP网络许可 1.添加Retrofit2依赖 链接2 implementation 'com.squareup.retrofit2:retrofit:2.8.1'...
    99+
    2022-06-06
    retrofit2 服务器 JSON retrofit Android
  • 服务器推送事件的示例分析
    这篇文章主要为大家展示了“服务器推送事件的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“服务器推送事件的示例分析”这篇文章吧。 ...
    99+
    2024-04-02
  • 阿里云邮件发送服务器错误怎么回事
    简介 在使用阿里云邮件服务时,有时候可能会遇到邮件发送服务器错误的问题。本文将针对这个问题进行详细的分析和解决方法。问题原因阿里云邮件发送服务器错误通常是由于以下几个原因引起的:邮件发送服务器设置不正确:可能是因为输入了错误的SMTP服务器...
    99+
    2024-01-19
    阿里 怎么回事 邮件发送
  • 使用 Redis,根据用户不断变化的时间偏好,通过 FCM 每天向用户发送一次消息,避免重复
    问题内容 上下文 我有很多帖子,每个帖子的赞成票和反对票计数都存储在我的 Postgres 数据库中。我正在运行 Gin Golang 服务器、Flutter 移动应用,并使用 FC...
    99+
    2024-02-06
    移动应用程序
  • HTML5服务器推送事件的示例分析
    这篇文章给大家分享的是有关HTML5服务器推送事件的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。服务器推送事件(Server-sent Events)是基于WebSoc...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作