如何用go写一个基于事件驱动的SSE的程序

这篇具有很好参考价值的文章主要介绍了如何用go写一个基于事件驱动的SSE的程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SSE(Serversentevents)是浏览器向服务器发送请求并保持长连接的技术,服务器通过长连接将数据推送到浏览器。SSE通常用于实时更新网页内容或获得服务器推送的通知。

下面是实现一个基于事件驱动的SSE程序的步骤:

  1. 创建一个HTTP服务器。
  2. 注册一个路由处理程序,用于处理SSE请求。
  3. 在路由处理程序中,设置响应头Content-Type为"text/event-stream",并且设置响应头Cache-Control为"no-cache"。
  4. 利用Go语言的channel实现事件订阅和发布。SSE的实现基于事件的发布和订阅模型,服务器在有新数据时将数据发布到channel,浏览器通过SSE的长连接订阅channel。
  5. 在路由处理程序中,启动一个协程,循环从channel中读取事件,将事件写入响应中,用分隔符"\n\n"分隔不同事件的数据。

下面是一个用Go语言实现基于事件驱动的SSE程序的代码示例:

package main

import (
    "fmt"
    "net/http"
    "time"
)

type Event struct {
    Data string
    Id   int
}

var clients = make(map[chan Event]bool)
var events = make(chan Event)

func main() {
    http.HandleFunc("/stream", streamHandler)
    go broadcastEvents()
    http.ListenAndServe(":8080", nil)
}

func streamHandler(w http.ResponseWriter, r *http.Request) {
    flusher, ok := w.(http.Flusher)
    if !ok {
        http.Error(w, "Streaming unsupported!", http.StatusInternalServerError)
        return
    }
    w.Header().Set("Content-Type", "text/event-stream")
    w.Header().Set("Cache-Control", "no-cache")
    w.Header().Set("Connection", "keep-alive")
    clientEventChan := make(chan Event)
    clients[clientEventChan] = true
    defer func() {
        delete(clients, clientEventChan)
        close(clientEventChan)
    }()
    for {
        select {
        case event := <-clientEventChan:
            fmt.Fprintf(w, "data:%s\nid:%d\n\n", event.Data, event.Id)
            flusher.Flush()
        case <-time.After(time.Second * 30):
            return
        }
    }
}

func broadcastEvents() {
    for {
        event := <-events
        for clientEventChan := range clients {
            clientEventChan <- event
        }
    }
}

这是一个简单的SSE服务器实现,可以在本地启动一个基于事件驱动的SSE服务器,在浏览器中访问"http://localhost:8080/stream"即可订阅事件。

在我们的SagooIOT开源的项目中就对SSE进行了封装,复杂的使用可以参考:https://iotdoc.sagoo.cn/文章来源地址https://www.toymoban.com/news/detail-475965.html

到了这里,关于如何用go写一个基于事件驱动的SSE的程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如何用 python 设计一个兑奖程序?

    💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】 💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 设计一个兑奖程序通常需要考虑很多方面,包括奖品种类、兑奖规则、输入输出

    2024年02月02日
    浏览(38)
  • 如何用python搭建一个小程序

    要用 Python 搭建小程序,首先需要了解小程序的基本框架和构建方式。 一种常用的方法是使用微信小程序框架,如微信小程序框架(mpvue)。这种框架可以使用 Vue.js 的语法来构建小程序,并使用 Python 编写后端逻辑。 步骤如下: 安装 Node.js 和 Vue CLI。 使用 Vue CLI 创建一个新项目

    2024年02月12日
    浏览(38)
  • 驱动开发:基于事件同步的反向通信

    在之前的文章中 LyShark 一直都在教大家如何让驱动程序与应用层进行 正向通信 ,而在某些时候我们不仅仅只需要正向通信,也需要反向通信,例如杀毒软件如果驱动程序拦截到恶意操作则必须将这个请求动态的转发到应用层以此来通知用户,而这种通信方式的实现有多种,

    2024年02月09日
    浏览(38)
  • SpringBoot SSE服务端主动推送事件详解

    SSE(Server Sent Event),直译为服务器发送事件,也就是服务器主动发送事件,客户端可以获取到服务器发送的事件。 我们常见的 http 交互方式是客户端发起请求,服务端响应,然后一次请求完毕。但是在SSE的使用场景下,客户端发起请求,然后建立SEE连接一直保持,服务端就可

    2024年02月07日
    浏览(33)
  • 如何用unity做一个合成图片的程序

    最近一直在做抗原检测,然后几个室友的图片需要合成一张然后传到大群里,每次都用ps来处理感觉一直在做重复动作,有点麻烦,于是就想能不能用我所学的知识来优化这个过程,减少重复劳动呢。 答案是肯定的,好歹也干了这么多年的客户端,这么点需求都不能实现,那

    2023年04月16日
    浏览(40)
  • golang使用sse事件流调用AI大模型

    本次Ai大模型,我们选择清华大学出品的智谱AI大模型,为什么呢?因为chatgpt已经有开源第三方库,可以直接调,但是要科学上网(借助代理也是可是实现的)。只要是公司业务有这方面的需求。。。 接口文档 没办法,照着python,java比葫芦画瓢,自己造。 我们来到非SDK用户这

    2024年04月09日
    浏览(33)
  • 如何用python做一个小程序,怎么用python做一个app

    这篇文章主要介绍了如何用python做一个小程序,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。 大家好,本文将围绕如何用python写小工具展开说明,python开发小工具项目是一个很多人都想弄明白的事情,

    2024年01月17日
    浏览(30)
  • 用python编写一个小程序,如何用python编写软件

    大家好,给大家分享一下用python编写一个小程序,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 我想有人曲解意思了,人家说用python开发渣蔽一个手机app,不是说用手机敲写python代码,当然可以啊,只不过在电脑上开发的应用软件要进行打包什么的,才能

    2024年02月07日
    浏览(46)
  • 如何用Python做一个聊天程序(1)(没废话,超实用!)

    以前我用过编程猫的Coco编辑器做过一个聊天App,但感觉不是很爽,处处都要受到限制。于是我按照我在编程猫上的思路,用Python制作了一个聊天程序。 下载一个MySQL数据库,并做好处理。这个数据库相当于整个程序的服务端。 客户端使用tkinter的GUI制作,主要功能包括:收信

    2024年02月05日
    浏览(43)
  • 在vue2中使用SSE(服务器发送事件)

    SSE(Server-Sent Events,服务器发送事件)是围绕只读Comet 交互推出的API 或者模式。 SSE API允许网页获得来自服务器的更新,用于创建到服务器的单向连接,服务器通过这个连接可以发送任意数量的数据。服务器响应的MIME类型必须是text/event-stream,而且是浏览器中的JavaScript API 能

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包