背景

openai 目前越来越流行,其他 ai 产业也随之而来,偶然翻到 openai接口文档,就想着可以调用接口实现智能聊天,接下来就写写我怎么接入 websocket 的过程,文笔不佳,谅解。

接入WebSocket

1. webSocket依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
<version>${spring.boot.version}</version> <!--填写springboot 版本 -->
</dependency>

2. 配置文件

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration
public class WebSocketConfig { /**
* 注入ServerEndpointExporter,该Bean会自动注册使用@ServerEndpoint注解申明的websocket endpoint
*/
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
} }

3. 编写Server


import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.handsometaoa.utils.HttpClientUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; @Slf4j
@Component
@ServerEndpoint(value = "/aiChatServer/{username}/{password}")
public class WebSocketServer { @Value("${ai.chat.url}")
private String aiChatUrl;
@Value("${ai.chat.token}")
private String aiChatToken; /**
* 记录当前在线连接信息
*/
public static final Map<String, Session> sessionMap = new ConcurrentHashMap<String, Session>(); /**
* 连接建立成功调用的方法
*/
@OnOpen
public void onOpen(Session session, @PathParam("username") String username,@PathParam("password") String password) {
// 1. todo: 校验密码(由于AI接口是计费的,所以需要校验密码)
// 2. 将用户session放入sessionMap中
sessionMap.put(username, session);
} /**
* 连接关闭调用的方法
*/
@OnClose
public void onClose(Session session, @PathParam("username") String username) {
sessionMap.remove(username);
} /**
* 收到客户端消息后调用的方法
* 用来处理接收到消息的逻辑
*/
@OnMessage
public void onMessage(String message, @PathParam("username") String username) {
log.info("服务端收到用户username={}的消息:{}", username, message);
// 调用AI接口获取回复
HashMap<String, String> headers = new HashMap<>();
headers.put("Authorization", "Bearer " + aiChatToken);
String requestBody = buildAiRequestBody(message);
String post = HttpClientUtil.post(aiChatUrl, headers, requestBody);
JSONObject response = JSONObject.parseObject(post);
String aiResponseText = response.getJSONArray("choices").getJSONObject(0).getJSONObject("message").getString("content");
// 由于是机器人对话聊天,消息发给自己
sessionMap.get(username).getAsyncRemote().sendText(aiResponseText);
} /**
* 发生错误时调用
*/
@OnError
public void onError(Session session, Throwable error) {
log.error("发生错误:{}",error.getMessage(),error);
} /**
* 服务端发送消息给客户端
*/
private void sendMessage(String message, Session toSession) {
try {
log.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message);
toSession.getBasicRemote().sendText(message);
} catch (Exception e) {
log.error("服务端发送消息给客户端失败", e);
}
} /**
* 服务端发送消息给所有客户端
*/
private void sendAllMessage(String message) {
try {
for (Session session : sessionMap.values()) {
log.info("服务端给客户端[{}]发送消息{}", session.getId(), message);
session.getBasicRemote().sendText(message);
}
} catch (Exception e) {
log.error("服务端发送消息给客户端失败", e);
}
} /**
* 封装构建OpenAi请求体
*/
private static String buildAiRequestBody(String message) {
JSONObject body = new JSONObject();
body.put("model","gpt-3.5-turbo");
JSONArray jsonArray = new JSONArray();
JSONObject messages = new JSONObject();
messages.put("role","user");
messages.put("content", message);
jsonArray.add(messages);
body.put("messages",jsonArray);
return body.toString();
}
}

测试

webSocket 测试网站:http://www.websocket-test.com/

补充

OpenAi接口文档 : https://platform.openai.com/docs/api-reference/chat

Springboot集成WebSocket实现智能聊天【Demo】的更多相关文章

  1. SpringBoot+Vue+WebSocket 实现在线聊天

    一.前言 本文将基于 SpringBoot + Vue + WebSocket 实现一个简单的在线聊天功能 页面如下: 在线体验地址:http://www.zhengqingya.com:8101 二 ...

  2. springboot集成websocket的两种实现方式

    WebSocket跟常规的http协议的区别和优缺点这里大概描述一下 一.websocket与http http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也必须要有三次握手才能 ...

  3. springboot集成websocket实现向前端浏览器发送一个对象,发送消息操作手动触发

    工作中有这样一个需示,我们把项目中用到代码缓存到前端浏览器IndexedDB里面,当系统管理员在后台对代码进行变动操作时我们要更新前端缓存中的代码怎么做开始用想用版本方式来处理,但这样的话每次使用代码 ...

  4. SpringBoot基于websocket的网页聊天

    一.入门简介正常聊天程序需要使用消息组件ActiveMQ或者Kafka等,这里是一个Websocket入门程序. 有人有疑问这个技术有什么作用,为什么要有它?其实我们虽然有http协议,但是它有一个缺 ...

  5. springboot集成websocket实现大文件分块上传

    遇到一个上传文件的问题,老大说使用http太慢了,因为http包含大量的请求头,刚好项目本身又集成了websocket,想着就用websocket来做文件上传. 相关技术 springboot web ...

  6. 使用websocket开发智能聊天机器人

    前面我们学习了异步web框架(sanic)和http异步调用库httpx,今天我们学习websocket技术. websocket简介 我们知道HTTP协议是:请求->响应,如果没有响应就一直等 ...

  7. SpringBoot集成websocket发送后台日志到前台页面

    业务需求 后台为一个采集系统,需要将采集过程中产生的日志实时发送到前台页面展示,以便了解采集过程. 技能点 SpringBoot 2.x websocket logback thymeleaf Rab ...

  8. SpringBoot集成WebSocket【基于纯H5】进行点对点[一对一]和广播[一对多]实时推送

    代码全部复制,仅供自己学习用 1.环境搭建 因为在上一篇基于STOMP协议实现的WebSocket里已经有大概介绍过Web的基本情况了,所以在这篇就不多说了,我们直接进入正题吧,在SpringBoot ...

  9. SpringBoot集成websocket(java注解方式)

    第一种:SpringBoot官网提供了一种websocket的集成方式 第二种:javax.websocket中提供了元注解的方式 下面讲解简单的第二种 添加依赖 <dependency> ...

  10. SpringBoot集成WebSocket【基于STOMP协议】进行点对点[一对一]和广播[一对多]实时推送

    原文详细地址,有点对点,还有广播的推送:https://blog.csdn.net/ouyzc/article/details/79884688 下面是自己处理的一些小bug 参考原文demo,结合工 ...

随机推荐

  1. ARC119F 题解

    前言 ARC119F 好厉害,是没见过的自动机 DP. 正文 [1] 分析 主要分析一下为什么这么写. [2] 状态设计 [3] 自动机状态转移 感觉状态设计中最难的就是如何处理带 \(O\) 的. ...

  2. Ubuntu18.04未发现WiFi适配器情况解决方案之一

    问题: 第一次你可能会遇见这种情况,ubuntu未发现Wifi适配器解决方案  无法打开WIfi 并告诉你没有WiFi适配器 解决方案: 解决方案如下: sudo modprobe -r ideapa ...

  3. .NET 9 RC1 正式发布

    .NET 9 RC1 是 .NET 9 的第一个候选发布版本(Release Candidate),标志着该版本接近最终发布.根据Github 上相关的内容,我们可以总结出以下几点: 新功能和改进: ...

  4. vue3项目部署到Github

    此教程适应于以webpack,vue-cli,vite等脚手架构建的vue项目.当然,vue2和vue3都是可以滴. 1. 前提:你的代码库已经提交到Github上 如果没有的话,请到GitHub上新 ...

  5. Angular 学习笔记 work with zip (压缩文件格式)

    最近在做批量创建. 上回说到了 读写 excel, 那么就可以通过 excel 的资料来创建资料了.但是资料经常会有图片,而 excel 里面放图片有点不太好. 于是就想 upload excel 的 ...

  6. CSS – Flex

    前言 Flex 诞生在 Float 之后, Grid 之前, 它主要是取代 Float 来实现布局. 而它没有 cover 到的地方则由 Grid 弥补. 所以当前, 我们做布局时, 几乎不用 Flo ...

  7. QT框架实现自定义形状截图效果

    文章目录 QT框架普通截图运行效果 QT框架系统级热键的原理 注册热键 反注册热键 获取系统级唯一的整数ID 删除系统级唯一整数ID 原生事件过滤器 QT框架截图的原理 截图窗口 拉框操作 系统剪切板 ...

  8. 自定义 AuthenticationProvider ,UserDetailsService的实现类@Autowired 为null

    项目场景: 整合spring security OAuth2自定义AuthenticationProvider 登录认证 签发token 问题描述: 在自定义 AuthenticationProvid ...

  9. 冒泡排序和一点优化(php)

    function maopao($arr){ $len = count($arr);//获取数组的长度 //有多少个数组元素就最多就要排n-1次 for ($j=0;$j<$len-1;$j++ ...

  10. apisix~kafka-logger插件

    作用 将http请求与响应的内容发到kafka的topic,以json的形式发送存储 配置相关 log_format为自定义配置字段,添加后,默认的请求响应消息将被覆盖 { "_meta&q ...