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. java中使用jdbc连接数据库操作

    先贴代码,在做说明 import java.sql.*; import java.util.ArrayList; import java.util.List; public class Conn { ...

  2. 初学者使用1Panel面板快速搭建WordPress网站

    之前介绍了宝塔面板以及如何搭建wordpress网站,这篇文章我们来学习如何使用1Panel面板搭建wordpress网站. 一.1Panel面板介绍 1. 介绍 1Panel 是一个现代化.开源的基 ...

  3. docker redis集群实验

    集群redis 分片+高可用+负载均衡 master + slave{1..5} 一个挂了另一个顶上 通过脚本创建6个redis配置文件 [root@docker ~]# for port in $( ...

  4. vue3 + ts 中出现 类型“typeof import(".........../node_modules/vue/dist/vue")”的参数不能赋给类型“Component<any, any, any, ComputedOptions, MethodOptions>”的参数。

    错误示例截图 解决方法 修改shims-vue.d.ts中的内容 declare module "*.vue" { import { defineComponent } from ...

  5. 【Mybatis】10 实现分页 & 分页插件

    回顾SQL分页查询 也就是说,在查询结果的最后控制返回的起始位置&记录数量 参数1:返回的开始位置 参数2:要返回的记录数 但是,如果说是只写了一个参数,直接表示参数2处理 LIMIT  [s ...

  6. 【SqlServer】Windows-2019 安装

    安装教程参考: https://blog.csdn.net/weixin_43790591/article/details/104149800 数据库SQL Server 2019 + 管理工具SQL ...

  7. pytorch报错:Variable._execution_engine.run_backward( # Calls into the C++ engine to run the backward pass RuntimeError: FIND was unable to find an engine to execute this computatio

    GPU模式下运行pytorch代码报错,pytorch为2.2.1,NVIDIA驱动版本535.161.07 File "/home/devil/anaconda3/envs/sample- ...

  8. 【转载】 Python格式化字符串f-string概览

    版权声明:本文为CSDN博主「sunxb10」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/sunxb10/a ...

  9. nginx实战教程

    大纲 为了让大家更快的学会,该博客中的内容录制成了视频课程:马上在线学习 1.什么是nginx Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 由 ...

  10. PHP 字符串大小写操作

    PHP为我们提供了字符串中大小写字母转换的函数, strtoupper()将指定的字符全部转换为大写: strtolower()将北定的字符都转换成小写: ucwords()将指定字符串中每个单词的首 ...