SSE介绍及使用(Server-Send Events)

一 介绍

SSE类似于WebSocket,用于服务端主动向客户端发送消息,保持长连接。而传统的HTTP,是客户端向服务端发送消息后,服务端再响应数据给客户端,且每次都需要客户端发起请求。

服务器发送事件 (SSE) 是一种简单的技术,用于为特定的 Web 应用程序实现服务器到客户端的异步通信。

SSE与WebSocket联系

SSE 是一种在基于浏览器的 Web 应用程序中仅从服务器向客户端发送文本消息的技术。SSE基于 HTTP 协议中的持久连接, 具有由 W3C 标准化的网络协议和 EventSource 客户端接口,作为 HTML5 标准套件的一部分。

WebSocket 是一种在 Web 应用程序中实现同时、双向、实时通信的技术。WebSocket 基于 HTTP 以外的协议(TCP),因此可能需要额外设置网络基础设施(代理服务器、NAT、防火墙等)。户端通过Http协议请求,在握手阶段升级为WebSocket协议。

java语言使用SSE实现监听远程服务端数据

引入依赖

xml 复制代码
 <dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp-sse</artifactId>
    <version>4.12.0</version>
 </dependency>
 <dependency>
   <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.3</version>
 </dependency>

代码:

java 复制代码
package com.ts.sse.demos.web;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.sse.EventSource;
import okhttp3.sse.EventSourceListener;
import okhttp3.sse.EventSources;


import java.util.concurrent.TimeUnit;

/**
 * @Author:sgw
 * @Date:2024/3/19
 * @Description: SSE客户端接收消息
 */
public class MySseController {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(50, TimeUnit.SECONDS)
                .readTimeout(10, TimeUnit.MINUTES)
                .build();

        EventSource.Factory factory = EventSources.createFactory(client);
        // 请求体
//        HashMap<String, Object> map = new HashMap<>();
//        map.put("prompt","哈喽,你好");
//        map.put("history", Arrays.asList());
//        map.put("temperature",0.9);
//        map.put("top_p",0.7);
//        map.put("max_new_tokens",4096);
//        String json = JsonUtil.objectToString(map);
        //RequestBody body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),"");

        // 请求对象
        Request request = new Request.Builder()
                .url("http://192.168.110.21:8080/v0/api/")
                .get()
                .build();

        // 自定义监听器
        EventSourceListener eventSourceListener = new EventSourceListener() {
            @Override
            public void onOpen(EventSource eventSource, Response response) {
                System.out.println("开启链接");
                super.onOpen(eventSource, response);
            }

            @Override
            public void onEvent(EventSource eventSource, String id, String type, String data) {
                System.out.println("接收到的远程服务端推送的数据" + data);
                //   接受消息 data
                super.onEvent(eventSource, id, type, data);
            }

            @Override
            public void onClosed(EventSource eventSource) {
                System.out.println("关闭连接");
                super.onClosed(eventSource);
            }

            @Override
            public void onFailure(EventSource eventSource, Throwable t, Response response) {
                System.out.println("连接失败");

                super.onFailure(eventSource, t, response);
            }
        };

        // 创建事件
        EventSource eventSource = factory.newEventSource(request, eventSourceListener);
    }
}
相关推荐
云烟成雨TD3 分钟前
Spring AI Alibaba 1.x 系列【28】Nacos Skill 管理中心功能说明
java·人工智能·spring
升鲜宝供应链及收银系统源代码服务5 分钟前
OMS 订单模块重构正式文档(一)---升鲜宝生鲜配送供应链管理系统
java·开发语言·重构·生鲜配送源代码·生鲜供应链源代码
Han.miracle9 分钟前
Redis 全套笔记:基础 API + 三大架构 + 缓存三大问题
java·windows·redis
zzb158012 分钟前
Fragment 生命周期深度图解:从 onAttach 到 onDetach 完整流程(面试必备)
android·java·面试·安卓
银色火焰战车32 分钟前
浅析golang中的垃圾回收机制(GC)
java·jvm·golang
zhangjw3433 分钟前
第4篇:Java数组与字符串:从基础用法到面试高频考点
java·java基础知识
俺爱吃萝卜41 分钟前
Spring Boot 3 + JDK 17:新一代微服务架构最佳实践
java·spring boot·架构
曹牧1 小时前
Spring :component-scan
java·后端·spring
下地种菜小叶1 小时前
定时任务系统怎么设计?一次讲清任务注册、分布式调度、幂等执行与失败补偿
java·开发语言·数据库·oracle·rabbitmq
做个文艺程序员1 小时前
Spring Boot 项目集成 OpenClAW【OpenClAW + Spring Boot 系列 第1篇】
java·人工智能·spring boot·开源