欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java如何基于okhttp請(qǐng)求SSE接口流式返回詳解

 更新時(shí)間:2024年03月30日 11:26:23   作者:蕭老板  
對(duì)于流式返回,Spring Boot提供了兩種不同的方式,下面這篇文章主要給大家介紹了關(guān)于Java如何基于okhttp請(qǐng)求SSE接口流式返回的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

最近在開發(fā)跟大模型相關(guān)的業(yè)務(wù),需要用java去請(qǐng)求大模型的對(duì)話接口并支持流式的返回,變用到了sse接口。首先介紹一下什么是SSE,SSE ( Server-sent Events )是 WebSocket 的一種輕量代替方案,使用 HTTP 協(xié)議。

嚴(yán)格地說,HTTP 協(xié)議是沒有辦法做服務(wù)器推送的,但是當(dāng)服務(wù)器向客戶端聲明接下來要發(fā)送流信息時(shí),客戶端就會(huì)保持連接打開,SSE 使用的就是這種原理。

一、SSE 能做什么?

理論上, SSE 和 WebSocket 做的是同一件事情。當(dāng)你需要用新數(shù)據(jù)局部更新網(wǎng)絡(luò)應(yīng)用時(shí),SSE 可以做到不需要用戶執(zhí)行任何操作,便可以完成。

這種技術(shù)通常用于實(shí)現(xiàn)實(shí)時(shí)更新、通知和事件驅(qū)動(dòng)的應(yīng)用程序,例如實(shí)時(shí)聊天、股票市場(chǎng)更新、新聞通知等。

二、SSE vs. WebSocket

SSE 是單向通道,只能服務(wù)器向客戶端發(fā)送消息,如果客戶端需要向服務(wù)器發(fā)送消息,則需要一個(gè)新的 HTTP 請(qǐng)求。這對(duì)比 WebSocket 的雙工通道來說,會(huì)有更大的開銷。這么一來的話就會(huì)存在一個(gè)「什么時(shí)候才需要關(guān)心這個(gè)差異?」的問題,如果平均每秒會(huì)向服務(wù)器發(fā)送一次消息的話,那應(yīng)該選擇 WebSocket。如果一分鐘僅 5 - 6 次的話,其實(shí)這個(gè)差異并不大。

在瀏覽器兼容方面,兩者差不多。在較早之前,每當(dāng)需要建立雙向 Socket 時(shí)就會(huì)使用 Flash,在 移動(dòng)瀏覽器不支持 Flash 的情況下,WebSocket 的兼容是比較難做的。

SSE 我認(rèn)為最大的優(yōu)勢(shì)是便利,實(shí)現(xiàn)一個(gè)完整的服務(wù)僅需要少量的代碼;可以在現(xiàn)有的服務(wù)中使用,不需要啟動(dòng)一個(gè)新的服務(wù);可以用任何一種服務(wù)端語言中使用;基于 HTTP / HTTPS 協(xié)議,可以直接運(yùn)行于現(xiàn)有的代理服務(wù)器和認(rèn)證技術(shù)。有了這些優(yōu)勢(shì),在選擇使用 SSE 時(shí)就已經(jīng)為自己的項(xiàng)目節(jié)約了不少成本。

三、下面來寫一下如何用java調(diào)用sse接口

我們可以借助okhttp來實(shí)現(xiàn),首先引入okhttp-sse的依賴:

  <dependency>
       <groupId>com.squareup.okhttp3</groupId>
       <artifactId>okhttp-sse</artifactId>
       <version>4.12.0</version>
   </dependency>

調(diào)用代碼如下:

        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(50, TimeUnit.SECONDS)
                .readTimeout(10, TimeUnit.MINUTES)
                .build();

        EventSource.Factory factory = EventSources.createFactory(client);
        // 請(qǐng)求體
        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"),json);
        // 請(qǐng)求對(duì)象
        Request request = new Request.Builder()
                .url("http://localhost:8001/chat")
                .post(body)
                .build();

        // 自定義監(jiān)聽器
        EventSourceListener eventSourceListener = new EventSourceListener() {
            @Override
            public void onOpen(EventSource eventSource, Response response) {
                super.onOpen(eventSource, response);
            }

            @Override
            public void onEvent(EventSource eventSource, @Nullable String id, @Nullable String type, String data) {
            //   接受消息 data
                super.onEvent(eventSource, id, type, data);
            }

            @Override
            public void onClosed(EventSource eventSource) {
                super.onClosed(eventSource);
            }

            @Override
            public void onFailure(EventSource eventSource, @Nullable Throwable t, @Nullable Response response) {
                super.onFailure(eventSource, t, response);
            }
        };

        // 創(chuàng)建事件
        EventSource eventSource = factory.newEventSource(request, eventSourceListener);

運(yùn)行效果

""
"你" 
"你好"
"你好??"
"你好??!"
"你好??!很高興"
"你好??!很高興見到"
"你好??!很高興見到你"
"你好??!很高興見到你,"
"你好??!很高興見到你,歡迎"
"你好??!很高興見到你,歡迎問我"
"你好??!很高興見到你,歡迎問我任何"
"你好??!很高興見到你,歡迎問我任何問題"
"你好??!很高興見到你,歡迎問我任何問題。"

總結(jié)

到此這篇關(guān)于Java如何基于okhttp請(qǐng)求SSE接口流式返回的文章就介紹到這了,更多相關(guān)Java請(qǐng)求SSE接口流式返回內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring+Quartz實(shí)現(xiàn)動(dòng)態(tài)任務(wù)調(diào)度詳解

    Spring+Quartz實(shí)現(xiàn)動(dòng)態(tài)任務(wù)調(diào)度詳解

    這篇文章主要介紹了Spring+Quartz實(shí)現(xiàn)動(dòng)態(tài)任務(wù)調(diào)度詳解,最近經(jīng)?;趕pring?boot寫定時(shí)任務(wù),并且是使用注解的方式進(jìn)行實(shí)現(xiàn),分成的方便將自己的類注入spring容器,需要的朋友可以參考下
    2024-01-01
  • idea熱部署插件jrebel正式版及破解版安裝詳細(xì)圖文教程

    idea熱部署插件jrebel正式版及破解版安裝詳細(xì)圖文教程

    這篇文章主要介紹了idea熱部署插件jrebel正式版及破解版安裝詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • 詳解使用Jenkins自動(dòng)編譯部署web應(yīng)用

    詳解使用Jenkins自動(dòng)編譯部署web應(yīng)用

    本篇主要介紹基于Jenkins實(shí)現(xiàn)持續(xù)集成的方式,通過案例介紹線上自動(dòng)編譯及部署的配置過程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java IO流 文件傳輸基礎(chǔ)

    Java IO流 文件傳輸基礎(chǔ)

    這篇文章主要介紹了Java IO流 文件傳輸基礎(chǔ)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-07-07
  • 基于Java實(shí)現(xiàn)本地APK文件搜索與HTTP下載服務(wù)

    基于Java實(shí)現(xiàn)本地APK文件搜索與HTTP下載服務(wù)

    在移動(dòng)應(yīng)用開發(fā)和測(cè)試過程中,經(jīng)常需要從本地服務(wù)器獲取最新的 APK 安裝包,本文將詳細(xì)介紹如何使用 Java 構(gòu)建一個(gè)能夠搜索本地最新 APK 文件并通過 HTTP 請(qǐng)求提供下載服務(wù)的應(yīng)用
    2025-07-07
  • Java中異常打印輸出的常見方法總結(jié)

    Java中異常打印輸出的常見方法總結(jié)

    Java異常是在Java應(yīng)用中的警報(bào)器,下面這篇文章主要給大家介紹了關(guān)于Java中異常打印輸出的常見方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-07-07
  • Java如何使用poi生成簡(jiǎn)單word文檔并導(dǎo)出

    Java如何使用poi生成簡(jiǎn)單word文檔并導(dǎo)出

    這篇文章主要介紹了Java如何使用poi生成簡(jiǎn)單word文檔并導(dǎo)出問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • java Collection 之Set使用說明

    java Collection 之Set使用說明

    本篇文章小編為大家介紹,java Collection 之Set使用說明。需要的朋友參考下
    2013-04-04
  • 作為Java程序員應(yīng)該掌握的10項(xiàng)技能

    作為Java程序員應(yīng)該掌握的10項(xiàng)技能

    這篇文章主要介紹了作為Java程序員應(yīng)該掌握的10項(xiàng)技能,包括java的知識(shí)點(diǎn)與相關(guān)的技能,對(duì)于java的學(xué)習(xí)有不錯(cuò)的參考借鑒價(jià)值,需要的朋友可以參考下
    2015-05-05
  • 一文帶你了解Spring中存入Bean和獲取Bean的方式

    一文帶你了解Spring中存入Bean和獲取Bean的方式

    這篇文章主要帶大家了解Spring中存入Bean和獲取Bean的方式,文中的代碼示例講解的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-07-07

最新評(píng)論