DeepSeekApi对接流式输出异步聊天功能:基于Spring Boot和OkHttp的SSE应用实现

news/2025/2/15 8:39:00/

实现异步聊天功能:基于Spring Boot和OkHttp的SSE应用

在现代Web应用程序开发中,实时更新的能力对于增强用户体验至关重要。本文将详细介绍如何利用Spring Boot框架结合OkHttp库实现一个简单的异步聊天服务,该服务能够接收用户输入并通过Server-Sent Events (SSE) 向客户端推送实时更新。

一、技术栈选择

为了构建这个服务,我们选择了以下技术:

  • Spring Boot:用于快速搭建RESTful API服务。
  • OkHttp:一款高效的HTTP客户端库,适用于Java应用,支持异步请求处理。
  • SSE(Server-Sent Events):一种允许服务器向浏览器推送更新的技术,特别适合于需要实时更新的应用场景。

二、核心逻辑详解

ChatController 类概览

我们的ChatController类主要包含了一个名为oneShot的方法,它负责接收POST请求,处理请求,并通过SSE返回结果给客户端。以下是该方法的具体实现细节。

定义HttpClient实例

首先,我们定义了一个OkHttpClient实例,设置了读取、写入和连接超时时间为60秒,以确保在网络状况不佳时仍有足够的时间完成操作。

private final OkHttpClient client = new OkHttpClient.Builder().readTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS).connectTimeout(60, TimeUnit.SECONDS).build();
oneShot 方法

oneShot方法是一个POST请求映射方法,它接收来自客户端的JSON格式数据,并转发至另一个API进行处理,最后通过SSE将结果推送给客户端。

@PostMapping(value = "/chat/oneShot", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter oneShot(@RequestBody String requestBody) {SseEmitter emitter = new SseEmitter(); // 创建一个新的SseEmitter实例用于异步事件流传输。// 使用OkHttp创建请求体,设置媒体类型为application/json,内容为requestBody。RequestBody body = RequestBody.create(MediaType.APPLICATION_JSON_VALUE, requestBody);// 构造一个HTTP POST请求,目标URL为http://10.155.28.19:11434/api/chat,携带body作为请求体。Request request = new Request.Builder().url("http://DeepSeek地址").post(body).build();// 异步执行HTTP请求,并注册回调处理响应或错误。client.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) { // 请求失败时调用此方法。handleError(emitter, e); // 调用handleError处理错误。}@Overridepublic void onResponse(Call call, Response response) throws IOException { // 请求成功时调用此方法。if (!response.isSuccessful()) { // 检查响应是否成功。handleError(emitter, new IOException("Unexpected code " + response)); // 如果不成功,则处理错误。return;}try (ResponseBody responseBody = response.body()) { // 获取响应体。if (responseBody != null) { // 确保响应体非空。processResponseStream(responseBody.byteStream(), emitter); // 处理响应流。}} catch (Exception e) { // 捕获可能的异常。handleError(emitter, e); // 出现异常时处理错误。}}});return emitter; // 返回SseEmitter实例,开始向客户端发送事件流。
}
错误处理方法

当发生网络错误或其他异常情况时,我们通过handleError方法将错误信息发送给客户端。

private void handleError(SseEmitter emitter, Exception e) {try {emitter.send(SseEmitter.event().id("error").data(e.getMessage())); // 发送错误事件。emitter.completeWithError(e); // 完成SseEmitter,并附带错误。} catch (IOException ex) { // 捕获可能的IO异常。ex.printStackTrace(); // 打印堆栈跟踪。}
}
响应流处理方法

该方法负责从响应流中读取数据,并将其分割成单独的JSON对象,然后通过SSE发送给客户端。

private void processResponseStream(java.io.InputStream inputStream, SseEmitter emitter) {try {byte[] buffer = new byte[1024]; // 创建一个1024字节的缓冲区。int bytesRead; // 存储每次读取的字节数。while ((bytesRead = inputStream.read(buffer)) != -1) { // 循环读取输入流直到结束。String data = new String(buffer, 0, bytesRead); // 将读取的字节转换为字符串。// 假设每条消息是以换行符分隔的JSON对象。for (String line : data.split("\n")) { // 分割字符串,按行处理。if (!line.trim().isEmpty()) { // 忽略空行。emitter.send(SseEmitter.event().data(line)); // 发送每一行数据作为事件。}}}emitter.complete(); // 完成SseEmitter,表示所有数据已发送完毕。} catch (IOException e) { // 捕获可能的IO异常。handleError(emitter, e); // 出现异常时处理错误。}
}

三、实践示例与代码解释

通过上述步骤,我们可以看到如何有效地集成Spring Boot与OkHttp,以及如何利用SSE为用户提供流畅的交互体验。整个过程包括接收客户端请求、转发请求到后端服务、处理响应并将结果实时推送给客户端。

关键点总结

  • 异步请求处理:使用OkHttp的异步请求机制避免了阻塞主线程,提高了程序的响应速度。
  • 错误处理:无论是网络问题还是响应处理过程中出现的异常,都被妥善处理并通过SSE通知客户端。
  • 流式传输:通过SSE机制实现了对响应流的逐行解析和实时推送,增强了用户体验。

四、结论

本文详细介绍了如何使用Spring Boot结合OkHttp和SSE技术构建一个简易但功能强大的异步聊天服务。这种方法不仅提高了开发效率,还增强了用户体验,非常适合需要实时更新的应用场景。希望这篇文章能为你的项目带来灵感,并帮助你更好地理解和运用这些技术。


http://www.ppmy.cn/news/1572194.html

相关文章

原生Three.js 和 Cesium.js 案例 。 智慧城市 数字孪生常用功能列表

对于大多数的开发者来言,看了很多文档可能遇见不到什么有用的,就算有用从文档上看,把代码复制到自己的本地大多数也是不能用的,非常浪费时间和学习成本, 尤其是three.js , cesium.js 这种难度较高&#xff…

【2025深度学习系列专栏大纲:深入探索与实践深度学习】

第一部分:深度学习基础篇 第1章:深度学习概览 1.1 深度学习的历史背景与发展轨迹 1.2 深度学习与机器学习、传统人工智能的区别与联系 1.3 深度学习的核心组件与概念解析 神经网络基础 激活函数的作用与类型 损失函数与优化算法的选择 1.4 深度学习框架简介与选择建议 第2…

如何在 Visual Studio Code 中使用 DeepSeek R1 和 Cline?

让我们面对现实吧:像 GitHub Copilot 这样的 AI 编码助手非常棒,但它们的订阅费用可能会在你的钱包里烧一个洞。进入 DeepSeek R1 — 一个免费的开源语言模型,在推理和编码任务方面可与 GPT-4 和 Claude 3.5 相媲美。将它与 Cline 配对&#…

基于springboot 以及vue前后端分离架构的求职招聘系统设计与实现

基于springboot 以及vue前后端分离架构的求职招聘系统设计与实现 随着互联网技术的飞速发展,求职招聘行业也在不断发生变革。传统的求职招聘方式往往存在着信息不对称、效率低下、交易成本高等问题,导致企业的招聘成本增加,求职者的体验下降…

盛铂科技 SMF106 低相位噪声贴片式频率综合器模块

在现代通信和电子设备领域,频率综合器作为关键组件,其性能优劣直接影响系统的整体表现。盛铂科技的 SMF106 低相位噪声贴片式频率综合器,以其卓越的性能和独特设计,成为众多高性能系统的选择。 一、频率覆盖范围广,步进…

对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 与基于 openEuler 构建 LVS-DR 群集

一、 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 NAT 模式 部署简单:NAT 模式下,所有的服务器节点只需要连接到同一个局域网内,通过负载均衡器进行网络地址转换,就可以实现负载均衡功能。不需要对…

ASP.NET Core 使用 FileStream 将 FileResult 文件发送到浏览器后删除该文件

FileStream 在向浏览器发送文件时节省了服务器内存和资源,但如果需要删除文件怎么办?本文介绍如何在发送文件后删除文件;用 C# 编写。 另请参阅:位图创建和下载 使用FileStream向浏览器发送数据效率更高,因为文件是从…

make命令学习

(make命令)代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。 make命令 一、make的概念二、Makefile文件的…