ProChat 如何接入 WebSocket

WebSocket是一种在单个TCP连接上进行全双工通信的协议,允许客户端和服务器之间进行双向实时通信。与Server-Sent Events (SSE)类似,WebSocket也能实现实时数据推送,但其功能更为强大且灵活。
全双工通信:WebSocket不仅允许服务器向客户端发送数据,也支持客户端向服务器发送数据,这样就构建了一个真正的双向通道。
持久连接:建立WebSocket连接后,该连接保持打开状态直到任一端主动关闭,减少了传统HTTP轮询或长轮询造成的资源浪费。
低延迟:由于连接一旦建立,消息可以立即通过此通道传输,因此延迟相对较低,适用于对实时性要求较高的应用。
轻量级协议:尽管是基于HTTP握手建立连接,但随后的数据交换采用二进制帧格式,更高效地传输数据。
ProChat 支持非流式和流式数据的展示,可以非常方便接入SSE数据。最新版的ChatGPT,会话交流由原来的SSE数据,改为了WebSocket,可以多客户端监听ChatGPT生成的数据。有意思的是,目前wss网络访问在国内没有限制。

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)
那么如何在ProChat中访问wss连接,并展示呢?
ProChat结果接收的是Response对象,需要自己组装 Reader 然后读取它,然后包裹他返回,组件最后接收的依然是一个只包含返回内容的 Stream 流。
例如创建ReadableStream,并返回结果:

const encoder = new TextEncoder();
const readableStream = new ReadableStream({
async start(controller) {
controller.enqueue(encoder.encode(“读取到的数据”));
controller.close();
},
});
return new Response(readableStream);

创建WebSocket连接,并在onmessage方法中持续监听来自服务器的消息,添加业务处理逻辑,将接受到的数据持续通过

controller.enqueue()方法添加到ReadableStream中:const ws = new WebSocket(rpsData.wss_url);  
ws.onmessage = (event) => {const newData = JSON.parse(event.data); // 假设服务器发送的是JSON数据var raw = atob(newData.body);raw = raw.substring(5).trim();if (raw == '[DONE]') {ws?.close();} else {try {const result = JSON.parse(raw);const data = result?.message?.content?.parts[0];// 将收到的数据块通过yield语句传递给ReadableStreamcontroller.enqueue(encoder.encode(data.replace(previousData,"")));previousData= dataconst status = result?.message?.status;if (status === 'finished_successfully') {previousData = "";ws?.close();}} catch (error) {console.log(error);}}};

交流+V B423651

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TestNG】(4) 重试机制与监听器的使用

在UI自动化测试用例执行过程中,经常会有很多不确定的因素导致用例执行失败,比如网络原因、环境问题等,所以我们有必要引入重试机制(失败重跑),来提高测试用例成功率。 在不写代码的情况没有提供可配置方式…

Mysql 慢查询日志

查询是否开启慢SQL日志 show variables like %slow_query_log; 开启慢查询日志 set global slow_query_logON; 可以通过修改MySQL的配置my.cfg或者my.ini永久生效 slow_query_logON # 开启慢查询日志开关 slow_query_log_file/var/lib/mysql/alvin-slow.log # 慢查询日志…

1.2 在卷积神经网络中,如何计算各层感受野的大小

1.2 在卷积神经网络中,如何计算各层感受野的大小 分析与解答: 在卷积神经网络中,由于卷积的局部连接性,输出特征图上的每个节点的取值,是由卷积核在输入特征图对应位置的局部区域内进行卷积而得到的,因此这…

COM - IWbemClassObject对象属性的遍历

文章目录 COM - IWbemClassObject对象属性的遍历概述笔记场景封装好的函数bool CWmiBase::enumObjVaule(IWbemClassObject* obj, std::wstring& val)bool CWmiBase::appendVarToString(BSTR& strName, VARIANT& var, std::wstring& val)bool CWmiBase::get_var…

【笔试强训错题选择题】Day5.习题(错题)解析

文章目录 前言 错题题目 错题解析 总结 前言 错题题目 1. ​ ​ 2. 3. ​ 4. ​ 5. ​ 错题解析 1. 移位运算符的使用 2. 3. 4. 5. 总结

如何用TCC实现分布式事务?

TCC事务介绍 TCC(Try-Confirm-Cancel)是除可靠消息队列以外的另一种常见的分布式事务机制,它是由数据库专家帕特 赫兰德(Pat Helland)在2007年撰写的论文《Life beyond Distributed Transactions: An Apostate’s Op…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的体育赛事目标检测系统(Python+PySide6界面+训练代码)

摘要:开发和研究体育赛事目标检测系统对于增强体育分析和观赏体验至关重要。本篇博客详细讲述了如何运用深度学习技术构建一个体育赛事目标检测系统,并提供了完整的实现代码。系统基于先进的YOLOv8算法,对比了YOLOv7、YOLOv6、YOLOv5的性能&a…

【webrtc】p2p_transport_channel 中忽略Hyper-V

【win11】更改网络适配器设置 删掉了hype-v,这时候wsl2 打不开了,但是重启后,还是存在hyper-v那么,让webrtc自己不适用hyper-v的网络Hyper-V 的全程:Hyper-V Virtual Ethernet Adapter https://github.com/SophistSolutions/Stroika/blob/2cd5e8bf4ee01cb5c423367b4df628f…

MFC 模态对话框退出机制的探究

一位读者问了这样一个问题: ” 如果我创建了一个可见的模态对话框,却对用户来说不可用。举个例子,假设我在程序中的其他位置收到一个事件,并且我从事件中调用模态 CDialog 上的 DestroyWindow。我注意到 OnDestroy 是在 CDialog 上调用的,但在将 WM_QUIT 消息发送到模态对…

在MyBatis中自定义JsonTypeHandler

在MyBatis中使用自定义的JsonTypeHandler 在处理数据库中的JSON字段时,我们经常需要将JSON字符串映射到Java对象,或者将Java对象序列化为JSON字符串以存储在数据库中。MyBatis作为一个流行的Java持久层框架,允许我们通过自定义类型处理器&am…

爬虫入门到精通_实战篇7(Requests+正则表达式爬取猫眼电影)_ 抓取单页内容,正则表达式分析,保存至文件,开启循环及多线程

1 目标 猫眼榜单TOP100:https://www.maoyan.com/board 2 流程框架 抓取单页内容:利用requests请求目标站点,得到单个网页HTML代码,返回结果。正则表达式分析:根据HTML代码分析得到电影名称,主演,上映时间,评分,图片…

跨域问题与解决方法

跨域问题与解决方法 同源策略 浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议域名端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。 同源策略限制以下几种行为: Cookie、LocalStorage 和 IndexDB 无法读取 DO…

C语言中的分支和循环语句:从入门到精通

分支和循环语句 1. 前言2. 预备知识2.1 getchar函数2.2 putchar函数2.3 计算数组的元素个数2.4 清屏2.5 程序的暂停2.6 字符串的比较 3. 结构化3.1 顺序结构3.2 分支结构3.3 循环结构 4. 真假性5. 分支语句(选择结构)5.1 if语句5.1.1 语法形式5.1.2 else…

Java网络通信UDP

目录 网络通信基础 UDP通信 服务器 1.想要使用UDP通信 要先打开DatagramSocket文件 端口号可以手动指定或系统随机分配 2.阻塞等待接收客户端数据;创建DatagramPacket接收客户端传来的数据 3.处理客户端传来的数据,并进行业务处理(这里…

MySQL 教程 2.4

MySQL UNION 操作符 本教程为大家介绍 MySQL UNION 操作符的语法和实例。 描述 MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合,并去除重复的行。 UNION 操作符必须由两个或多个 SELECT 语句组成,每个 SELECT 语句的列数…

Python降维数据库之umap使用详解

概要 在数据科学和机器学习领域,数据通常是高维度的,而高维度数据不仅难以可视化,还会增加建模的复杂性。降维是一种处理高维数据的关键技术,而Python UMAP(Uniform Manifold Approximation and Projection)是一种强大的降维工具,它在保留数据结构的同时,将高维数据映…

uni-app引用外部js文件

全局引用 在App.vue文件中添加如下代码 这样在全局所有页面中都可以直接使用该外部js中的函数 onLaunch: function() {var script document.createElement(script);script.src "https://www.test.com/api/testapi.js";document.body.appendChild(script); }, 单…

【IDEA+通义灵码插件】实现属于你的大模型编程助手

目录 1.前言 2.下载安装 3.解释代码 4.生成单元测试 5.生成注释 6.智能补全 1.前言 大模型到底该以一种什么方式落地,从而嵌入我们的工作当中,助力我们工作效率的提升,其实最好的方式也许就是虚拟助手的方式,就像钢铁侠的&…

【OpenCV基础(三)】Ubuntu系统下EasyPR环境配置

环境配置 1、资源下载2、环境配置2.1、1、将EasyPR压缩包拷贝到Ubuntu 三种方法任选一种2.2、解压得到EasyPR文件夹(文件夹一层进入后EasyPR资源内容)2.3、终端命令修改权限**chmod -R 777 ./ EasyPR**2.4、查找EasyPR/include/easypr/config.h,使用gedit方式打开2.…

uni-app app实现web-view H5图片长按下载

问题和使用场景描述: uniapp app web-view中图片无法长按保存,IOS下是正常的,但是Android下长按无反应 解决方案: 下载mui.min.js,放到项目中的static下(下载见最上面的压缩包) 在static目录下新建script.js mui.…