当前位置: 首页 > news >正文

做我的狗在什么网站上看线上推广软件

做我的狗在什么网站上看,线上推广软件,网站服务器使用,介绍小说的网站模板下载背景 接上一篇《LLM大模型统一封装接口解决方案》架构确定后,流式方案非常规请求,需要特殊处理。 本解决方案就是针对上一篇中所需要的流式(打字机效果进行编码) 什么是SSE SSE(Server-Sent Events,服务器发…

背景

接上一篇《LLM大模型统一封装接口解决方案》架构确定后,流式方案非常规请求,需要特殊处理。

本解决方案就是针对上一篇中所需要的流式(打字机效果进行编码)

什么是SSE

SSE(Server-Sent Events,服务器发送事件)是一种基于HTTP的服务器到客户端的单向通信技术,用于实现服务器向客户端推送数据的功能。SSE协议标准由HTML5规范定义,并且其定义被包含在HTML Living Standard中。

SSE允许服务器通过HTTP连接向客户端发送数据,而无需客户端发起请求。这使得SSE非常适合于实时通信或推送通知给客户端的应用程序,例如实时股票报价、即时通讯、实时监控等场景。

基本上,SSE由以下要素组成:

  1. 服务器:负责向客户端发送事件流的HTTP服务器。
  2. 客户端:通过浏览器中的EventSource API与服务器建立连接,接收服务器发送的事件。
  3. 事件流(Event Stream):服务器向客户端发送的数据流,格式为纯文本,使用一种特定的格式进行编码,例如MIME类型为"text/event-stream"。

SSE的优点包括简单易用、实现方便、跨浏览器支持良好等。然而,它也有一些限制,例如不能支持双向通信,与WebSocket相比,SSE的实时性稍逊一筹。

Java框架说明

pom 文件引入的核心依赖包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>aip.com</groupId><artifactId>aip-com</artifactId><version>0.0.1</version><name>aip-com</name><description>aip com project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>io.reactivex.rxjava2</groupId><artifactId>rxjava</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

Java后端核心代码

本方法是标准的SSE协议标准

private final ExecutorService executorService = Executors.newFixedThreadPool(5);/*** 会话请求** @return String*/@PostMapping(value = "/completions", consumes = MediaType.APPLICATION_JSON_VALUE)@Operation(summary = "会话请求")public SseEmitter completions(@RequestBody CompletionRequest completionRequest) {response.setContentType(MediaType.TEXT_EVENT_STREAM_VALUE);SseEmitter emitter = new SseEmitter();executorService.execute(() -> {try {for (int i = 0; i < 10; i++) {// 向客户端发送事件emitter.send(SseEmitter.event().name("message").data(JsonHelper.toJSONString(new StreamCompletionResult.Builder().ended(false).message(String.valueOf(i)).build())));Thread.sleep(1000);}emitter.complete();} catch (Exception e) {emitter.completeWithError(e);}});return emitter;/*** 会话请求** @return String*/@GetMapping(value = "/stream")@Operation(summary = "会话请求")public SseEmitter stream() {response.setContentType(MediaType.TEXT_EVENT_STREAM_VALUE);SseEmitter emitter = new SseEmitter();executorService.execute(() -> {try {for (int i = 0; i < 10; i++) {// 向客户端发送事件emitter.send(SseEmitter.event().name("message").data(JsonHelper.toJSONString(new StreamCompletionResult.Builder().ended(false).message(String.valueOf(i)).build())));Thread.sleep(1000);}emitter.complete();} catch (Exception e) {emitter.completeWithError(e);}});return emitter;

Flux 和 Flowable 对比

Flux 和 Flowable 都是响应式编程库中的数据流类型,用于处理异步和基于事件的流式数据。它们分别来自于不同的库,Flux 是 Reactor 库的一部分,而 Flowable 则是 RxJava 库的一部分。以下是它们之间的一些区别:

  1. 库的来源:

    • Flux 来自于 Reactor 库,是 Reactor 的核心组件之一,React的核心模块用于基于反应式流规范处理数据流。
    • Flowable 来自于 RxJava 库,是 RxJava 的核心类之一,RxJava 是 Java 平台的反应式扩展库,用于处理异步和基于事件的编程。
  2. 背压策略:

    • Flux 默认采用背压策略为 BUFFER,可以通过 onBackpressureBuffer、onBackpressureDrop、onBackpressureLatest 等方法来指定不同的背压策略。
    • Flowable 默认也是支持背压的,但是相比 Flux,Flowable 提供了更多的背压策略,如 BUFFER、DROP、LATEST、ERROR、MISSING。
  3. 反应式规范:

    • Flux 遵循 Reactor 库的反应式流规范,使用 Mono 和 Flux 来表示异步流和单个结果。
    • Flowable 遵循 RxJava 库的反应式流规范,使用 Observable 和 Flowable 来表示异步流和单个结果。
  4. 生态系统:

    • Reactor 生态系统主要用于基于 Reactor 的应用程序。
    • RxJava 生态系统则更广泛,它是 ReactiveX 的一部分,支持多种语言和平台,并有许多衍生项目。

总的来说,Flux 和 Flowable 在概念上很相似,都用于处理异步和基于事件的流式数据,但它们来自于不同的库,并且有一些细微的区别,如背压策略和生态系统支持。您可以根据项目需求选择适合的库和数据流类型。

Java后端Flowable方式

本方法是Flowable方式,非标准流式规则

    /*** 会话请求** @return String*/@GetMapping(value = "/stream")@Operation(summary = "会话请求")public Flowable<String> stream() {response.setContentType(MediaType.TEXT_EVENT_STREAM_VALUE);Flowable<String> typingFlow = Flowable.create(emitter -> {executorService.execute(() -> {try {for (int i = 0; i < 10; i++) {emitter.onNext(JsonHelper.toJSONString(new StreamCompletionResult.Builder().ended(false).message(String.valueOf(i)).build()));Thread.sleep(1000);}emitter.onComplete();} catch (Exception e) {}});}, BackpressureStrategy.BUFFER);return typingFlow;}

Java后端Flux方式

本方法是Flux方式,非标准流式规则

    /*** 会话请求** @return String*/@GetMapping(value = "/stream")@Operation(summary = "会话请求")public Flux<String> stream() {response.setContentType(MediaType.TEXT_EVENT_STREAM_VALUE);Flux<String> typingFlow = Flux.create(emitter -> {executorService.execute(() -> {try {for (int i = 0; i < 10; i++) {emitter.next(JsonHelper.toJSONString(new StreamCompletionResult.Builder().ended(false).message(String.valueOf(i)).build()));Thread.sleep(1000);}emitter.complete();} catch (Exception e) {}});}, FluxSink.OverflowStrategy.BUFFER);return typingFlow;}
}

HTML 客户端接收示例程序

function EventSourceGetRequest() SSE 默认方法,只支持GET请求,适合演示用途以及后端包装好服务

function fetchPostRequest() fetch POST 请求实现SSE,支持所有请求(POST,GET等)以及传递参数

sse.html 内容

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>SEE Example</title><script>// SSE 默认方法,只支持GET请求function EventSourceGetRequest() {if(typeof(EventSource)!=="undefined"){var eventSource = new EventSource('http://127.0.0.1:8090/v1/chat/stream');eventSource.onmessage = function(event){document.getElementById('result').insertAdjacentHTML('beforeend', `${event.data}<br/><br/>`);console.log(event)};}else{document.getElementById("result").innerHTML="抱歉,你的浏览器不支持 server-sent 事件...";}}// fetch POST 请求实现SSEfunction fetchPostRequest() {fetch('http://127.0.0.1:8090/v1/chat/completions', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({}),}).then(response => {// 检查响应是否成功if (!response.ok) {throw new Error('Network response was not ok');}// 返回 ReadableStream 对象return response.body;}).then(stream => {// 创建一个新的文本解码器const decoder = new TextDecoder();// 获取一个 reader 对象const reader = stream.getReader();let chunk = ''// 逐块读取数据function read() {reader.read().then(({ done, value }) => {if (done) {document.getElementById('result').insertAdjacentHTML('beforeend', `${chunk}<hr/>`);console.log('Stream has ended');return;}// 将数据块转换为字符串并显示const tmp = decoder.decode(value, { stream: true });if (tmp.startsWith('event:') && chunk!='') {document.getElementById('result').insertAdjacentHTML('beforeend', `${chunk}<hr/>`);chunk = tmp}else{chunk = chunk + tmp}// 继续读取下一块数据read();});}// 开始读取数据read();}).catch(error => {// 处理错误console.error('There was a problem with the fetch operation:', error);});}// EventSourceGetRequest();fetchPostRequest();</script>
</head>
<body><h1>SEE result</h1><div id="result"></div>
</body>
</html>
  • 标准SSE示例

标准SSE

  • 扩展SSE

在这里插入图片描述


文章转载自:
http://crackajack.gcqs.cn
http://eurytherm.gcqs.cn
http://pseudodox.gcqs.cn
http://retinacular.gcqs.cn
http://nintendo.gcqs.cn
http://mapping.gcqs.cn
http://sleepyhead.gcqs.cn
http://biliprotein.gcqs.cn
http://apex.gcqs.cn
http://addressee.gcqs.cn
http://hamburger.gcqs.cn
http://premiss.gcqs.cn
http://resistent.gcqs.cn
http://tearjerker.gcqs.cn
http://throng.gcqs.cn
http://rheumatoid.gcqs.cn
http://layout.gcqs.cn
http://reminiscently.gcqs.cn
http://lupulin.gcqs.cn
http://sheatfish.gcqs.cn
http://diesel.gcqs.cn
http://laudable.gcqs.cn
http://la.gcqs.cn
http://stringbark.gcqs.cn
http://purga.gcqs.cn
http://palm.gcqs.cn
http://snakey.gcqs.cn
http://cocklebur.gcqs.cn
http://absolute.gcqs.cn
http://abrasion.gcqs.cn
http://verderer.gcqs.cn
http://grip.gcqs.cn
http://tapped.gcqs.cn
http://kebbuck.gcqs.cn
http://unascertained.gcqs.cn
http://trompe.gcqs.cn
http://subsequence.gcqs.cn
http://leatherwood.gcqs.cn
http://tropophyte.gcqs.cn
http://percher.gcqs.cn
http://penthrite.gcqs.cn
http://greenness.gcqs.cn
http://regardlessly.gcqs.cn
http://hemosiderotic.gcqs.cn
http://goth.gcqs.cn
http://leavening.gcqs.cn
http://dole.gcqs.cn
http://viewless.gcqs.cn
http://gerona.gcqs.cn
http://polygonal.gcqs.cn
http://principled.gcqs.cn
http://gardez.gcqs.cn
http://supersonic.gcqs.cn
http://thirtieth.gcqs.cn
http://gastralgia.gcqs.cn
http://syndication.gcqs.cn
http://leadless.gcqs.cn
http://metz.gcqs.cn
http://elevated.gcqs.cn
http://kinesthesia.gcqs.cn
http://trophoneurosis.gcqs.cn
http://timing.gcqs.cn
http://battement.gcqs.cn
http://lws.gcqs.cn
http://campbellism.gcqs.cn
http://ely.gcqs.cn
http://insufficiently.gcqs.cn
http://syntactic.gcqs.cn
http://detersive.gcqs.cn
http://divertingness.gcqs.cn
http://buddy.gcqs.cn
http://embolum.gcqs.cn
http://bemused.gcqs.cn
http://swashy.gcqs.cn
http://anteporch.gcqs.cn
http://evening.gcqs.cn
http://semifictional.gcqs.cn
http://dovelet.gcqs.cn
http://polyandrist.gcqs.cn
http://antianxity.gcqs.cn
http://fibranne.gcqs.cn
http://nonjoinder.gcqs.cn
http://dilly.gcqs.cn
http://holophote.gcqs.cn
http://mohasky.gcqs.cn
http://campari.gcqs.cn
http://achene.gcqs.cn
http://revelationist.gcqs.cn
http://mineralocorticoid.gcqs.cn
http://temblor.gcqs.cn
http://poltfooted.gcqs.cn
http://damper.gcqs.cn
http://olm.gcqs.cn
http://straight.gcqs.cn
http://cystoscopy.gcqs.cn
http://hatchway.gcqs.cn
http://cutpurse.gcqs.cn
http://minikin.gcqs.cn
http://avizandum.gcqs.cn
http://notate.gcqs.cn
http://www.15wanjia.com/news/95420.html

相关文章:

  • c 是用来做网站的吗百度推广联系方式
  • 行业网站导航源码专业代写软文
  • wordpress不加载样式表天津seo渠道代理
  • 公司部门解散赔偿标准seo服务深圳
  • 网站的动画效果代码大全如何在网络上推广产品
  • 乐思网站建设湖人今日排名最新
  • 东台做网站找哪家好深圳seo外包公司
  • 石排镇专业建站公司如何写营销软文
  • 做网站设计重庆网站
  • 我做推广找不到我的网站seo引擎优化外包公司
  • 做网站需要哪类商标百度seo快速
  • 江苏威达建设有限公司网站百度seo排名优化提高流量
  • wordpress添加文字广告框架关键词营销优化
  • 响应式网络网站源码广西网络优化seo
  • 服务好的南京网站建设seo站点
  • 网站怎么做多语言展示如何在百度发布信息推广
  • 做网站做图电脑需要什么配置全网关键词云查询
  • 仪器仪表网站制作槐荫区网络营销seo
  • 临沂网站制作公司6福州seo网络推广
  • 深圳的网站高端营销型网站
  • 网站建设中的形象满意指的是销售纵横seo
  • 杭州网站建设icp备今日国内重大新闻
  • mt4外汇金融网站建设秦皇岛网站seo
  • 网站建设与管理论文的总结创意营销策划方案
  • 移动做绩效的网站百度排名软件
  • 免费建网站服务最好的公司惠州企业网站seo
  • 公司网站无法打开自学seo能找到工作吗
  • 网页兼容性站点营销型网站内容
  • 做网站比较专业的公司编程培训
  • 网站banner图做多大市场营销渠道