package chat

import (
"encoding/json"
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/rest/httpx"
"log"
"net/http"
"X/common/response"
"X/common/util"
"X/internal/logic/frontend/chat"
"X/internal/svc"
"X/internal/types" "github.com/r3labs/sse/v2"
) func SendSSEMessage(server *sse.Server, s, messageId, kfId, streamId string, baseInfo any) { var (
state int64
relationId string
)
if baseInfo != nil {
switch d := baseInfo.(type) {
case *types.ChatResponse:
state = d.State
relationId = d.RelationId
case *types.EnquireResponse:
state = d.State
relationId = d.RelationId
case *types.PracticeResponse:
state = d.State
relationId = d.RelationId
default:
log.Println("Unsupported type:", d)
}
} returnMessage, _ := json.Marshal(types.ChatSseResponse{
Message: s,
State: state,
RelationId: relationId,
})
server.Publish(streamId, &sse.Event{
Data: returnMessage,
})
} func ChatSseHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
logger := logx.WithContext(r.Context())
streamId := r.URL.Query().Get("stream")
if streamId == "" {
logger.Errorf("stream is empty ")
return
} server := sse.New()
server.CreateStream(streamId) var req types.ChatSseRequest
if err := httpx.Parse(r, &req); err != nil {
httpx.ErrorCtx(r.Context(), w, err)
return
} l := chat.NewChatSseLogic(r.Context(), svcCtx) channel := make(chan string, 50)
baseInfoCh := make(chan any, 1) go func() {
server.ServeHTTP(w, r)
}()
go func() {
defer func() {
close(channel)
close(baseInfoCh)
}() res := &types.ChatSseResponse{}
var errChat error res, errChat = l.ChatSse(&req, channel, baseInfoCh)
if errChat != nil {
logger.Error("ChatSseHandler error:", errChat)
} res.ErrorMessage = response.GetErrorMessage(errChat)
returnMessage, _ := json.Marshal(res)
server.Publish(streamId, &sse.Event{
Data: returnMessage,
})
}()
baseInfo := <-baseInfoCh
var rs []rune
length := 4
for {
s, ok := <-channel
if !ok {
if len(rs) > 0 {
SendSSEMessage(server, string(rs), req.MessageId, req.OpenKfID, streamId, baseInfo)
rs = []rune{}
}
break
}
rs = append(rs, []rune(s)...) if len(rs) > length {
SendSSEMessage(server, string(rs), req.MessageId, req.OpenKfID, streamId, baseInfo)
rs = []rune{}
if length < 4 {
length++
}
}
}
}
}

go 实现sse的更多相关文章

  1. SSE指令集学习:Compiler Intrinsic

    大多数的函数是在库中,Intrinsic Function却内嵌在编译器中(built in to the compiler). 1. Intrinsic Function Intrinsic Fun ...

  2. SSE指令集优化学习:双线性插值

    对SSE的学习总算迈出了第一步,用2天时间对双线性插值的代码进行了优化,现将实现的过程梳理以下,算是对这段学习的一个总结. 1. 什么是SSE 说到SSE,首先要弄清楚的一个概念是SIMD(单指令多数 ...

  3. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...

  4. 【HTML5】浅析html使用SSE(Server-Sent Events)连接JSP

    目录结构: // contents structure [-] 关于SSE的一些话 什么是SSE SSE的浏览器支持情况 SSE的工作机制 使用SSE连接JSP文件 HTMl页面 服务器端 错误 错误 ...

  5. Comet、SSE、技术

    1.概念: 利用长时间保留的HTTP请求(‘挂起的GET’)来让服务器向浏览器推送数据的技术,经常被称为Comet. SSE让服务器可以向客户端流式发送文本消息,比如服务器上生成的实时通知或更新.

  6. SSE:服务器发送事件,使用长链接进行通讯

    概述 传统的网页都是浏览器向服务器“查询”数据,但是很多场合,最有效的方式是服务器向浏览器“发送”数据.比如,每当收到新的电子邮件,服务器就向浏览器发送一个“通知”,这要比浏览器按时向服务器查询(po ...

  7. SSE技术详解:一种全新的HTML5服务器推送事件技术

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

  8. 【转】【SSE】基于SSE指令集的程序设计简介

    基于SSE指令集的程序设计简介 作者:Alex Farber 出处:http://www.codeproject.com/cpp/sseintro.asp SSE技术简介 Intel公司的单指令多数据 ...

  9. 【转】【SEE】基于SSE指令集的程序设计简介

    SSE技术简介 Intel公司的单指令多数据流式扩展(SSE,Streaming SIMD Extensions)技术能够有效增强CPU浮点运算的能力.Visual Studio .NET 2003提 ...

  10. SSE入门

    此文主要内容来自这篇文章,本文翻译只求能理解,不求逐句翻译. 正文: 我们将在本文中介绍如何在C++/C中使用SSE指令.我的目的不是用SSE写尽可能快的程序,而是试图讲明白它的使用方法. 什么是SS ...

随机推荐

  1. 胜未来:国内大模型+Agent应用案例精选,以及主流Agent框架开源项目推荐

    智胜未来:国内大模型+Agent应用案例精选,以及主流Agent框架开源项目推荐 Agent是以大模型为核心的智能体,通过与用户对话的形式,来完成各种任务,它很像一个"人".如果和 ...

  2. 奇怪的回溯增加了 | leetcode131分割回文串

    题目要求:给你一个字符串 s,请你将s分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案 示例 1: 输入:s = "aab" 输出:[["a" ...

  3. CCStheia添加include路径

    一.在系统内找到该路径 二.复制该路径,并更改写法 C:\Users\c1519\workspace_ccstheia\OLED\user_lib 改为: C:/Users/c1519/workspa ...

  4. idea2020修改help的vm options之后导致idea打不开的问题

    如图所示,如果你修改了VM参数,导致启动没反应,证明你的参数配置有误. 这个时候你可能会想着直接修改idea安装目录bin中的配置文件,但是这个文件并不是你在idea中修改的配置文件,所以你修改这里的 ...

  5. FusionAccess liteAD

    回车回车 fusion access完成 进入access网页 https://IP:8443进入web网页 输入用户名:admin:密码:IaaS@PORTAL-CLOUD8! 输入完账号密码后改密 ...

  6. Linux环境 yum,apt-get,rpm,wget 区别

    Linux环境 yum,apt-get,rpm,wget 区别 一般来说linux系统基本上分两大类:cat /etc/issue查看linux系统版本RedHat系列:Redhat.Centos.F ...

  7. 【Server - 运维】更改腾讯云数据库参数设置

    购买的MySQL实例是一个屏蔽了后台设置的服务器: 默认大小写设置是使用严格区分的: 要设置忽略大小写,就要在my.cnf中更改配置参数 https://cloud.tencent.com/devel ...

  8. 模具仿真软件FASTAMP —— 华中科技大学材料成形及模具技术国家重点实验室

    相关介绍: https://www.ruanfujia.com/software/9525/ FASTAMP 是由华中科技大学材料成形及模具技术国家重点实验室独立设计开发的,是专业的板料冲压成形快速分 ...

  9. 数值优化算法-BFGS

    参考: https://www.cnblogs.com/Leo_wl/p/3367323.html 牛顿法: 使用牛顿法优化函数 f(θ) 最小值时,每次计算获得新的\(θ\)值,即\(θ_{k+1} ...

  10. maven实战教程-含视频讲解

    1.背景 2.什么是maven? 通俗的说就是,不用手动拷贝jar包,帮我们管理项目结构,只需要配置坐标,自动从中央仓库下载(其他介绍请百度...). 3.Maven的安装与配置 注意:Maven在使 ...