JavasSEDemo31IO流

小而美的服务端推送技术SSE之理论与实战(含demo) Server-Sent Events,服务器向浏览器推送信息, 注意反过来不行,基于http协议的服务端推送技术 阅读详情

简介

  • 本文是2021/04/29整理的笔记
  • 赘述可能有点多,还请各位朋友耐心阅读
  • 本人的内容和答案不一定是最好最正确的,欢迎各位朋友评论区指正改进

易错练习题

练习1

byte b = 127;
System.out.println(-b);

选择程序运行结果
A、-127
B、0
C、-128
D、运行错误
答案
A

练习2

对于switch/case语句以下说法正确的有。
A、default语句是可选的,但是如果出现default则必须位于所有的case后面
B、case子句后面的值必须是常量,且不可重复
C、switch后面的表达式的值如果是数值型,则必须是可精确匹配的整数值,如int\long,而不能是浮点数
D、case后面的break是必选的,不能省略break

练习3

以下哪个是有关封装优点的正确描述?
A、 可以不用定义成员变量
B、 可以直接通过类名修改属性
C、 可以不需要改变接口来改变实现,以达到外部使用代码无需变动
D、 可以不需要改变实现来改变接口,已达到外部使用代码无需变动

练习4

当一个类的所有构造器均为私有的,以下哪个描述是正确的?
A、 不能被其他类实例化
B、 不能被其他类继承
C、 既不能被其他类实例化,也不能被其他类继承
D、 该类必须被final修饰

练习5

交易明细文件内容如下例:log.txt
#姓名 性别 帐号 发生额
刘德华|1|4155990188888888|300.00
晓龙|1|1155990199999999|500.00
黄晓明|1|4155990100000000|1000.50
张东健|1|4155990155555555|600.99
梁朝伟|0|4155990111111111|5000.00
刘德华|1|4155990188888888|200.00
张东健|1|4155990155555555|500.99
刘德华|1|4155880188888888|1200.00
PS:1)一行是一条交易明细,每行分4列,列间用|分隔。#为注释符号。
2)类TransRecord存储一条明细。
实现功能:
一个人可能消费有多笔。(当姓名和账号相同的话就认为是同一人)统计每个人的消费总额。按消费额的金额升序排序。要求显示每个人的姓名、性别、帐号、消费总额的信息

public  class TransRecord implements Comparable<TransRecord>{
    private String name;
    private int sex;
    private String number;
    private double money;

    @Override
    public String toString() {
        return "Exchange{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", number='" + number + '\'' +
                ", price=" + money +
                '}';
    }

    public TransRecord() {
    }

    public TransRecord(String name, int sex, String number, double price) {
        this.name = name;
        this.sex = sex;
        this.number = number;
        this.money = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }




    @Override
    public int compareTo(TransRecord o) {
        double d = this.getMoney() - o.getMoney();
       if(d >0){
           return 1;
       }else{
           return -1;
       }
    }
}
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.TreeSet;
public class Demo03homework {
    public static void main(String[] args) throws IOException {
        //创建TreeSet集合,存储类型为TransRecord
        TreeSet<TransRecord> treeSet = new TreeSet<>();
        TreeSet<TransRecord> treeSet1 = new TreeSet<>();
        //创建基本字符输入流
        FileReader fileReader = new FileReader("D:\\AJavaStudyTest\\homework\\log.txt");
        //创建缓冲字符输入流
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String line;
        while((line = bufferedReader.readLine())!=null){
            if(line.contains("|")){
                String[] split = line.split("\\|");
                TransRecord transRecord = new TransRecord(split[0], Integer.parseInt(split[1]), split[2], Double.parseDouble(split[3]));
                boolean flag =false;
                for (TransRecord record : treeSet) {
                    if(record.getName().equals(transRecord.getName()) && record.getNumber().equals(transRecord.getNumber()) && record.getSex()==(transRecord.getSex())){
                        flag =true;
                        record.setMoney(record.getMoney() + transRecord.getMoney());
                    }
                }
                if(!flag){
                    treeSet.add(transRecord);
                }
            }
        }
        bufferedReader.close();
        fileReader.close();
        for (TransRecord transRecord : treeSet) {
            treeSet1.add(transRecord);
        }
        for (TransRecord transRecord : treeSet1) {
            System.out.println("transRecord = " + transRecord);
        }
    }
}

练习6

题目:
将一个文件夹中的内容复制到其它目录中。(比如:把D:\chenhao中的内容复制一份到 e:\zhangsan文件夹中)
(递归和通过字节流来进行复制FileInputStream和FileOutputStream)

import org.junit.Test;
import java.io.*;

/**
 * 将一个文件夹中的内容复制到其它目录中。(比如:把D:\\chenhao中的内容复制一份到 e:\\zhangsan文件夹中)
 * (递归和通过字节流来进行复制FileInputStream和FileOutputStream)
 */
public class Demo03 {
    @Test
    public void test() throws IOException {
        diGui(new File("D:\\A国创"),new File("D:\\B国创"));
    }
    private void diGui(File source,File dest) throws IOException {
        //source存在
        if(source.exists()){
            if(source.isDirectory()){
                //在目标文件夹创建这个文件夹
                File dir = new File(dest + "/" + source.getName());
                //创建子文件夹
                dir.mkdirs();
                //遍历原文件夹的每一项
                File[] files = source.listFiles();
                if (files!=null && files.length >0) {
                    for (File file : files) {
                        //file.exists()
                            diGui(file, dir);
                }
            }
        }else {
                copy(source, dest);
                return;
            }
            }
    }

    public  void copy(File source, File dest) throws IOException {
        BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(source));
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(dest + "/" + source.getName()));
        byte[] bytes = new byte[1024];
        int length;
        while((length = bufferedInputStream.read(bytes))!=-1){
            bufferedOutputStream.write(bytes,0,length);
        }
        bufferedOutputStream.close();
        bufferedInputStream.close();
    }


}


注意:Win10系统在复制文件夹之前,需要将文件夹权限改为完全访问。

练习7

题目
获取一个文件夹下所有指定后缀名(.java)的文件(包括子文件夹中的内容),并将这些文件的绝对路径写入到一个文本文件中

import org.junit.Test;

import java.io.*;

public class Demo08 {
    private PrintWriter printWriter= new PrintWriter(new FileWriter("result.txt"));

    public Demo08() throws IOException {
    }

    @Test
    public void test(){
        diGui(new File("D:\\王力宏"));
        printWriter.close();
    }

    private void diGui(File file){
        if(file.isDirectory()){
            File[] files = file.listFiles();
            for (File file1 : files) {
                if(file1.isFile()){
                    save(file1);
                }else {
                    diGui(file1);
                }
            }
        }else {
            save(file);
        }
    }

    private void save(File file){
        if(file.getName().endsWith(".java")){
            //向文件写
            printWriter.println(file.getAbsolutePath());
        }
    }
}

练习8

题目
题目:实现一个方法日志记录器,将每次方法的调用信息存放在单一的文本日志文件中,并能够分析日志文件中包含的数据:调用次数最多的方法,调用总耗时最长的方法
考点:输入输出流
难度:中
思路:

  1. 日志文件
  2. 写内容:类#方法名#开始时间#结束时间#本次耗时
  3. 什么时候写日志:方法里开头写:类#方法名#开始时间 方法结尾写:#结束时间#本次耗时
  4. 分析日志文件:读取日志文件逐行解析
    (1)调用次数最多的方法:map: key:类+方法名组合 value:调用次数
    (2)调用总耗时最长的方法:map key:类+方法名组合 value:耗时
import java.io.FileNotFoundException;
import java.io.PrintWriter;

public class Logger {
    private PrintWriter printWriter;
    {
        try {
            printWriter = new PrintWriter("log.txt");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    public void log(String string){
        printWriter.print(string);
        printWriter.flush();
    }
    public void logLn(String string){
        printWriter.println(string);
        printWriter.flush();
    }
}

import java.text.SimpleDateFormat;
import java.util.Date;

public class MyClass {
    private Logger logger = new Logger();
    public void eat(){
        logger.log(this.getClass().getName() + "#eat()#" +getTime()+"#");
        long start  = System.currentTimeMillis();
        System.out.println("MyClass.eat([])方法");
        try {
            Thread.sleep(1200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        //方法结尾写:#结束时间#本次耗时
        logger.logLn(getTime()+"#"+(end-start));
    }
    public String getTime(){
        return  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS").format(new Date());
    }
    public void study(){
        logger.log(this.getClass().getName() + "#study()#" +getTime()+"#");
        long start  = System.currentTimeMillis();
        System.out.println("MyClass.study([])方法");
        try {
            Thread.sleep(2200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        //方法结尾写:#结束时间#本次耗时
        logger.logLn(getTime()+"#"+(end-start));
    }

    public void drink(){
        logger.log(this.getClass().getName() + "#drink()#" +getTime()+"#");
        long start  = System.currentTimeMillis();
        System.out.println("MyClass.drink([])方法");
        try {
            Thread.sleep(5200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        //方法结尾写:#结束时间#本次耗时
        logger.logLn(getTime()+"#"+(end-start));
    }
    public void play(){
        logger.log(this.getClass().getName() + "#play()#" +getTime()+"#");
        long start  = System.currentTimeMillis();
        System.out.println("MyClass.play([])方法");
        try {
            Thread.sleep(1200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        //方法结尾写:#结束时间#本次耗时
        logger.logLn(getTime()+"#"+(end-start));
    }
}

public class TestMyClass {
    public static void main(String[] args) {
        MyClass myClass = new MyClass();
        myClass.eat();
        myClass.eat();
        myClass.eat();
        myClass.drink();
        myClass.drink();
        myClass.study();
        myClass.study();
        myClass.play();
    }
}

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class TestLogAnalysis {
    public static void main(String[] args) throws IOException {
        //分析日志文件:读取日志文件逐行解析
        BufferedReader bufferedReader = new BufferedReader(new FileReader("log.txt"));
        String line;
        Map<String, Integer> map1 = new HashMap<>();
        Map<String, Integer> map2 = new HashMap<>();
        while((line = bufferedReader.readLine())!=null){
            String[] split = line.split("#");
            String key = split[0] + "-" + split[1];
                //解决数量问题
                Integer count = map1.get(key);
                if(count != null){
                    map1.put(key,count+1);
                    //原来没有,就放1
                }else {
                    map1.put(key,1);
                }

                //耗时
                Integer time = map2.get(key);
                if(time !=null){
                    map2.put(key,time + Integer.parseInt(split[4]));
                }else {
                    map2.put(key,Integer.parseInt(split[4]));
                }

        }

       //调用次数最多的方法
        int maxCount = 0;
        String maxKey = null;
        for (Map.Entry<String, Integer> entry : map1.entrySet()) {
            if(entry.getValue() > maxCount){
                maxCount = entry.getValue();
                maxKey = entry.getKey();
            }
        }
        System.out.println("调用方法最多的是"+maxKey + ",调用方法次数是:"+maxCount);


        //调用时间最长的方法
        int maxTime = 0;
        for (Map.Entry<String, Integer> entry : map2.entrySet()) {
            if(entry.getValue() > maxCount){
                maxTime = entry.getValue();
                maxKey = entry.getKey();
            }
        }
        System.out.println("调用方法最多的是"+maxKey + ",调用方法次数是:"+maxTime);


        bufferedReader.close();
    }
}

序列化与反序列化

什么是序列化

  • 将对象的状态信息保存到流中的操作,称为序列化。

什么是反序列化

  • 将流中读取对象状态信息的操作称为反序列化。

怎么实现序列化

  1. 让实体类实现Serializable 接口 生成serialVersionUID
  2. 创建ObjectOutputStream(new FileOutputStream(文件名称))
  3. 调用writeObject(new 对象)

怎么实现反序列化

  1. new ObjectInputStream(new FileInputStream(文件名称))
  2. 调用readObject()返回Object,向下转型,将其强转为对应的对象。
  3. 打印输出

自定义序列化1

  1. 在实现了Serializable接口的类中写两个方法
  2. private void writeObject(ObjectOutputStream out){
    out.defaultWriteObject();
    out.writeUTF(address+“小贝贝”);
    }
  3. private void readObject(ObjectInputStream in){
    in.defaultReadObject();
    address = in.readUTF();
    }

自定义序列化2

  1. 在实现了Serializable接口的类中写两个方法
  2. private void writeObject(ObjectOutputStream out){
    out.writeUTF(name+“小贝贝”);
    out.writeInt(age);
    out.writeUTF(addres+“小贝贝”)
    }
  3. private void readObject(ObjectInputStream in){
    name = in.readUTF();
    age = in.readInt();
    address = in.readUTF();
    }

自定义序列化3

  1. 让类实现Externalizable接口。重写2个方法
 @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeUTF(name+"小贝贝");
        out.writeInt(age);
        out.writeUTF("天安门"+address);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        name = in.readUTF();
        age = in.readInt();
        address = in.readUTF();
    }

在字段前加transient关键字,该字段就不会被默认序列化

在字段前加static关键字,该字段页不会被默认序列化

serialVersionUID推荐加上,如果不加:会根据类名 属性名 方法名 接口名 生成;如果修改了其中的任何一项,都会引起serialVersionUID的改变,反序列化会引发InvalidClassException异常

Java实现ChatGpt根据SseEmitter流式输出 在工作中基于使用大模型需要进行流式输出效果,公司客服助手需要接入大模型,并传参prompt给大模型参考知识,由大模型根据理解进行答案润色,润色后的结果进行流式输出。 阅读详情

相关推荐

sse-spring-boot-demo

Spring Boot中的服务器发送事件 该存储库包含 如何在Spring Boot( sse-demo-server )中实现服务器发送事件(SSE) sse-demo-server 如何使用事件的示例( sse-demo-client ) 在我的(荷兰语)阅读有关服务器发送事件的信息。

Java使用Server-Sent Events (SSE) 的demo

HTTP 更适用于一次性请求和响应的情况,例如加载网页内容或提交表单数据。SSE 更适用于需要持续更新的应用,比如新闻流、聊天室或者动态图表的数据更新。然而,这两种协议并不是互斥的。实际上,在许多情况下,它们会被结合使用,以便充分利用各自的优势。例如,一个应用程序可能会用 HTTP 来加载初始页面,然后用 SSE 来提供实时更新。

m0_62056932的博客 1601

无人自行车平衡控制:最小二乘法动态零点拟合实践

本文探讨了无人自行车平衡控制中动态零点的重要性及实现方法。通过最小二乘法拟合车头角度与ROL值的线性关系,解决了固定零点在转向时导致的稳定性问题。实践表明,动态零点拟合能显著提升系统平衡稳定性并降低能耗。

uran的专栏 661

SSE(Server-Sent Events)| 前后端demo参考

SSE(Server-Sent Events)| 前后端demo参考 | java实现

你个无聊小demo的博客 3238

蒙特卡洛+概率潮流!基于蒙特卡洛和新能源出力模拟的概率潮流分布程序代码!

最后,导出光照强度、风速、网损和节点电压的概率分布图,并计算了各节点电压和网损的平均值和方差,展示了接入前后的节点电压对比图。在不确定性增加的电力系统中,概率潮流成为含随机因素规划问题的求解前提,可以更加真实地反映电力系统的全面信息。此外,概率潮流还可用于研究风电和光伏发电出力以及电动汽车消耗功率和向电力系统反向供电功率的不确定性对电力系统的影响,发现系统运行中的潜在风险,为系统运行控制提供参考。概率潮流的目的是揭示电网中随机变量对系统的影响,发现电网中的薄弱环节,为规划和调度部门的决策提供有价值的信息。

weixin_48747334的博客 1921

机器人环境仿真软件:Gazebo_(6).传感器仿真

通过 Gazebo 和 ROS,我们可以方便地配置和使用多种传感器,进行机器人环境的仿真和调试。传感器仿真不仅帮助我们验证和测试机器人的感知能力,还可以在真实部署前发现和解决潜在的问题。本节详细介绍了如何在 Gazebo 中配置激光雷达、摄像头、IMU、声纳和 GPS 传感器,并展示了如何在 ROS 中接收和处理这些传感器数据。此外,还介绍了多传感器融合的基本方法和调试工具,希望这些内容能对你的机器人仿真工作有所帮助。

kkchenjj的博客 1389

百度文心一言 java 支持流式输出,Springboot+ sse的demo

和其他的接口不一样 需要 CompletionsResponse.data 封装下 ,不然前端页面需要兼容非json的格式。3、WenxinEventSourceListener 事件监听器。2、配置apikey和secretkey。4、返回的json格式。

wangqiaowq的博客 2752

MoCap 动作捕捉开源库教程

数据通过 tf2 和支持不同 QoS 设置的 /poses 主题直接发布。该软件包最初是为 Crazyswarm 开发的,用于跟踪多达 50 个飞行机器人。

机器人控制与仿真应用 1308

sse接口测试demo(sse-test测试dome)

【代码】sse接口测试demo(sse-test测试dome)

weixin_61434483的博客 1967

信号与电源完整性5:轨道塌陷噪声/电源轨道噪声分析及降低解决方案

经过上一节关于串扰的分析,我们已经清楚,噪声问题不仅仅来源于信号网络;电源和地网络所产生的噪声,被反馈到其所在的元器件和信号网络时,其破坏力也是巨大的;本节所讨论的轨道塌陷噪声就是一个典型的实例。在经过电源的地网络的电流发生改变时,在电源和地之间的阻抗上将产生一个压降;由于该压降的产生,用电元件的电压将直接被拉低,甚至可能对电路产生功能性的错误。接下来硬小二将详细的分析电源轨道噪声和降低其的解决方法。...

fydar的博客 2243

11年电赛综合测评——单运放三角波发生器

目录 背景知识科普: 原理:局部负反馈+大环负反馈+积分器 仿真图如下: 背景知识科普: 反馈电路是将放大器输出信号(电压或电流)的一部分或全部,回收到放大器输入端与输入信号进行比较(相加或相减),并用比较所得的有效输入信号去控制输出,这就是放大器的反馈过程。 一、反馈放大器反馈极性的经验分析法—符号法 分析步骤1.在输入端上加上一个“+”或“-”的输入信号,按瞬时极性法标出反馈放大器中各个电极(基极b,集电极c,发射极e)电压的瞬时性。 2.判断经放大和反馈后得到的反馈信号Xf的瞬时极性

沉迷单车的追风少年 9906

java通过SSE实现消息推送

严格地说,HTTP 协议无法做到服务器主动推送信息。但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息(streaming)。也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。本质上,这种通信就是以流信息的方式,完成一次用时很长的下载。SSE 就是利用这种机制,使用流信息向浏览器推送信息。它基于 HTTP 协议,目前除了 IE,其他浏览器都支持。

wj1qaz的博客 2315

Testbench编写:激励生成、响应监控、仿真时间控制

本文介绍了Verilog/VHDL Testbench的核心技术,重点阐述了激励生成、响应监控和仿真时间控制三大关键环节。通过时钟生成、复位信号生成等具体代码示例,展示了如何有效构建测试平台。文章还总结了波形输出、自动检查等验证方法,并提出了模块化设计、自动化检查等最佳实践,帮助开发者提升FPGA仿真效率和验证质量。这些技术要点为数字电路设计的正确性验证提供了系统化的解决方案。

2301_79143213的博客 112

记录java sse简单小例子

JavaSSE(Server-SentEvents)是一种用于在Web应用程序中发送实时数据的技术,它允许服务器向客户端推送数据,而无需客户端发送请求‌‌。SSE基于HTTP协议,支持单向通信,即服务器可以向客户端推送数据,但客户端不能向服务器推送数据‌。通过springboot的简单例子。//处理服务器返回的数据。//通过http发送消息。

vbniepwq的博客 980

xilinx原语及bank简介

图8是HP bank与HR bank的IO模块,其中PAD是FPGA的金属管脚,IOB是输入、输出引脚的控制模块。此时使用原语就可以只调用需要的组件,不需要去考虑其余组件参数设置,就方便很多,借助此次机会就对IDDR、ODDR、IDELAYE2、ODELAYE2、IDELAYCRTL、ISERDESE、OSERDESE等几个原语做了简要了解,并对原语的各个模式进行了仿真,本文最初是介绍IDDR的,但在介绍IDDR这些原语之前,还需要了解一下7系列FPGA bank的分类和区别,所以就有了本文。

qq_43416206的博客 413

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

前端SSE连接测试demo

前端SSE连接测试demo。

芳草萋萋鹦鹉洲哦 826

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

SSE(Server-sent Events) demo 屏幕共享

SSE(Server-sent Events) demo 屏幕共享 SSE( Server-sent Events )是 WebSocket 的一种轻量代替方案,使用 HTTP 协议 SSE是单向通道,只能服务器向客户端发送消息。

daqinzl的专栏 527

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SpringBoot整合SSE,实现后端主动推送DEMO

说起服务端主动推送,大家第一个想到的一定是WEBSOCKET。作为软件工程师,不能无脑使用一种技术,要结合实际情况,择优选取。SSE(Server-Sent Events)相比于WEBSOCKET1、轻量化、兼容性 基于传统的HTTP协议,所以浏览器兼容性比较好2、 只支持单向通讯。(服务器->客户端)

zjy660358的专栏 2420

JavaSE小Demo

Java SE学习小案例

qq_44372246的博客 315

开发消息通知的神器SSE接口 demo

本文演示了如何使用Node.js实现SSE(Server-Sent Events)服务端推送功能。服务端代码使用Express框架,设置SSE响应头并每2秒发送一条模拟数据。客户端通过EventSource API建立连接,监听消息事件并处理接收到的数据。该方案适用于需要服务器向浏览器实时推送数据的场景,如通知、实时更新等,相比WebSocket更轻量级且实现简单。

全易 359

WebSocket与SSE深度对比与实战 Demo

WebSocket与SSE深度对比:实时通信技术选型指南 本文全面对比了WebSocket和SSE两种实时通信技术。WebSocket是基于TCP的全双工协议,支持双向实时通信,适用于聊天应用等场景;SSE是基于HTTP的单向推送技术,适用于服务器主动推送数据的场景。文章从核心概念、技术差异、代码实现三个维度进行深入分析,并提供了完整的Demo实现。关键差异包括:WebSocket支持双向通信和二进制数据但开发复杂,SSE仅支持单向文本推送但实现简单。开发者在选型时需根据业务需求(如通信方向、数据类型、开发

m0_46165586的博客 836

SSE和文件下载代理Java版

Java请求代理 SSE Download HTTP

永远sayYES的博客 1098

JAVA应用使用SSE长连接进行即时通讯

JAVA应用使用SSE长连接实现流式输出的经验总结

weixin_38554080的博客 1万+

golang笔试题(实例)

选择题(多选) 1.关于switch语句,下面说法正确的有() A、条件表达式必须为常量或者整数 B、单个case中,可以出现多个结果选项 C、需要用break来明确退出一个case D、只有在case中明确添加fallthough关键字,才会继续执行紧跟的下一个case 答案:BD 2.通过指针变量p访问其成员变量name,下面说法正确的是() A、p.name B、(*p).name C、(&p).name D、p->name 答案:AB 3.关于接口和类的说法,下面说法正确的是()

kucfire 4383

一个java项目中,如何使用sse协议,构造一个chatgpt的流式对话接口

前言如何注册chatGPT,怎么和它交互,本文就不讲了;因为网上教程一大堆,而且你要使用的话,通常会再包一个算法服务,用来做一些数据训练和过滤处理之类的,业务服务基本不会直接与原生chatGPT交互。而下面阐述的,就是业务服务与算法服务的交互。

路辉的博客 3352

GO GIN & SSE DEMO

将GIN项目与SSE库结合,写一个简单的demo,具备正常的API接口和流处理接口,实现了两种类型的 Server-Sent Events (SSE) 流,以及一个简单的用户管理接口。这样做可以让每个文件更专注于自己的任务,保持代码清晰整洁,有利于团队合作和代码维护。文件保持不变,用于处理用户相关的接口。文件会引入所有的路由注册函数,包括。文件只处理时间流的 SSE 接口。文件只处理数字流的 SSE 接口。

GitHub个人仓库地址:https://github.com/feiyuluoye ; 个人塔罗牌占卜平台:http://118.126.82.12:8080/ ; 欢迎广大Coding友共同交流讨论。 2725
上一篇: JavaSEDemo30IO流
下一篇: JavaSEDemo32IO流与网络编程
香鱼嫩虾
博客等级 码龄7年 1671粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香鱼嫩虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值