首页 > 其他分享 >流式输出写法

流式输出写法

时间:2023-10-16 22:33:43浏览次数:29  
标签:输出 res springframework 流式 io org import 写法

后台使用 Server-Sent Events 技术,简称 SSE , 是一种基于 HTTP 协议的服务器推送技术,允许服务器向客户端发送数据和信息。与 WebSocket 不同,SSE 是一种单向通信方式,只有服务器可以向客户端推送消息。SSE 是 HTML5 规范的一部分,使用非常简单,主要由服务端与浏览器端的通讯协议(HTTP协议)和 EventSource 接口来处理 Server-sent events 组成,服务器端的响应的内容类型是“text/event-stream”。

后台代码:

package com.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * @return
 */
@Controller
@Slf4j
public class ChatgptController {

    @Autowired
    private ResourceLoader resourceLoader;

    @RequestMapping("/article")
    public void sendArticle(HttpServletResponse res) throws Exception {
        //流式输出请求头参数
        res.setContentType("text/event-stream;charset=UTF-8");

        String resourcePath = "other/预备好的文本文件.txt";
        Resource resource = new ClassPathResource(resourcePath);
        InputStream inputStream = resource.getInputStream();
        
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = reader.readLine()) != null) {
            // 这里用空格来将一行内容分为多个单词输出
            String delimiter = " ";
            String[] words = line.split(delimiter);
            // 为了支持将中文句子分为单个汉子输出
            if (words.length == 1) {
                delimiter = "";
                words = line.split(delimiter);
            }
            for (int i = 0; i < words.length; i++) {
                // 每次只输出一个词,每个片段以data: 开头,以\n\n结尾
                res.getWriter().write("data: " + words[i] + delimiter + "\n\n");
                res.getWriter().flush();
                // 控制输出速率,如果不设置,则一次性全部输出,如果文件过大,直接卡死
                Thread.sleep(100);
            }
            // 由于每次读的是一行数据,因此输出一个换行
            res.getWriter().write("data: </br>\n\n");
        }
        // 也用[done]来标识结束
        res.getWriter().write("data: [done]\n\n");
        res.getWriter().flush();
    }
    
}

前端代码:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>流式输出接收方式</title>
    </head>
    <body>
        <button type="button" onclick="output()">输出文章</button>
        <div id="message"></div>
        <script>
            function output() {
                let source = new EventSource(
                    'http://localhost:8180/cmhkevent/article');
                let innerHTML = '';
                source.onmessage = function(e) {
                    if(e.data == '[done]') {
                        source.close();
                    } else {
                        innerHTML += e.data;
                        document.getElementById("message").innerHTML = innerHTML;
                    }
                };
            }
        </script>
    </body>
</html>

感谢原作者:https://zhuanlan.zhihu.com/p/634018241?utm_id=0

翻译

搜索

复制

标签:输出,res,springframework,流式,io,org,import,写法
From: https://www.cnblogs.com/xuehuashanghe/p/17768530.html

相关文章

  • 【STM32基础 CubeMX】PWM输出
    @TOC前言STM32微控制器是一系列功能强大的微控制器,广泛应用于嵌入式系统和电子设备中。其中一个常见的应用是生成PWM信号,用于控制各种设备,如电机、LED灯、声音发生器等。了解如何配置和使用PWM输出对于嵌入式系统开发非常重要。CubeMX是STMicroelectronics提供的一种工具,用于帮助开......
  • 前端打怪之旅=>Es6入门(对象简化写法、函数)
    对象的简化写法ES6允许在大括号里面,直接写入变量和函数,作为对象的属性和方法这样的书写更加简洁letname='浅辄';letchange=function(){console.log('我可以改变世界');}constschool={......
  • logback-thtf.xml 日志输出控制
    <?xmlversion="1.0"encoding="UTF-8"?><configurationscan="true"scanPeriod="60seconds"debug="false"><!--日志存放路径--><propertyname="log.path"value="logs/go......
  • ABB机器人示教器中配置组输入输出
    很多学员在学习和使用机器人的过程中,会遇到一个很重要的东西,就是我们机器人要做输入输出时需要配置对应的信号。那我们配置对应信号的前提是要配置IO版。本篇文章就是基于已经配置好了DSQC652的信号板情况下的一个IO设置。注意:各位学员需要注意,并不是所有信号......
  • AP8851H 宽电压降压恒压DC-DC 电源管理芯片 5V 12V输出 零功耗 快充方案应用
    1,产品描述  AP8851H一款宽电压范围降压型DC-DC电源管理芯片,内部集成使能开关控制、基准电源、误差放大器、过热保护、限流保护、短路保护等功能,非常适合在宽输入电压范围具有优良的负载和线性调整度。AP8851H芯片包含每周期的峰值限流、软启动、过压保护和温度保护,......
  • 【gdb】输出信息多时不会暂停输出
    输出信息多时不会暂停输出有时当gdb输出信息较多时,gdb会暂停输出,并会打印“---Type<return>tocontinue,orq<return>toquit---”这样的提示信息,如下面所示:81process26391020xff04af84in__lwp_park()from/usr/lib/libc.so.180process25735660xff04......
  • Vue3| Pinia 的 action 异步写法
    import{defineStore}from'pinia'import{ref}from'vue'importaxiosfrom'axios'exportconstuseChannelStore=defineStore('channel',()=>{  constchannelList=ref([])  constgetList=()=>......
  • php读取txt随机一行一个数据输出
    php读取txt随机一行一个数据输出,代码如下<?phpfunctiongetline($file){$i=0;do{$data=file($file);$num=count($data);$id=mt_rand(0,$num-1);$shuju_text=chop($data[$id]);$i=strlen($shuju_text);}while($i<1);ech......
  • python实现fasta文件碱基序列每行按照指定数目输出
     001、(base)[root@pc1test1]#lsa.fatest.py(base)[root@pc1test1]#cata.fa##测试fasta>chr1tttcccggg>chr2tttgggjjjcccjjjjjj>chr3ccc>chr4aaaaatt(base)[root@pc1test1]#cattest.py##程序#!/usr/bin/envpython3#......
  • python实现ppt内容输出为word形式
    一、只输出文本内容frompptximportPresentationfromdocximportDocumentwordfile=Document()#给定ppt文件所在的路径filepath=r"C:\Users\18703\Desktop\智家经分\智家经分v2.pptx"pptx=Presentation(filepath)#遍历ppt文件的所有幻灯片页forslideinppt......