良心分享:基于Java+SpringBoot+Netty+WebSocket+Uniapp轻松搭建在线互动问答程序

简介: 本文将详细介绍如何基于你自己的开源项目搭建一个在线互动问答程序,包括微信小程序和H5网页版。该项目服务端主要使用了Java + Spring Boot + Netty + WebSocket等技术栈,聊天客户端使用的是UniApp来轻松搭建微信小程序和H5网页端。

一步一步教你搭建在线互动问答程序(微信小程序/H5网页)

本文将详细介绍如何基于你自己的开源项目搭建一个在线互动问答程序,包括微信小程序和H5网页版。
该项目服务端主要使用了Java + Spring Boot + Netty + WebSocket等技术栈,聊天客户端使用的是UniApp来轻松搭建微信小程序和H5网页端。

1. 项目准备

在开始之前,请确保已经准备好以下环境和工具:

  • IDE(推荐使用IntelliJ IDEA)
  • HBuilder X
  • 微信小程序开发工具

2. 架构设计

在线互动问答程序的架构设计如下:

  • 服务端使用Java和Spring Boot框架搭建,其中使用Netty框架实现WebSocket服务器。
  • 客户端提供了微信小程序和H5两种平台,可以通过WebSocket与服务端进行通信。

3. 服务端搭建

  • Github完整代码DEMO
https://gitee.com/yeeevip/yeee-chatgpt

https://github.com/yeeevip/yeee-chatgpt

3.1 创建Spring Boot项目

使用IDE创建一个新的Spring Boot项目,并添加相关依赖:

<dependencies>
    ...
    <!-- 该依赖封装了Netty + websocket,并集成到springboot-starter中 -->
    <dependency>
        <groupId>vip.yeee.memo</groupId>
        <artifactId>common-netty-websocket</artifactId>
    </dependency>
    <!-- 引入此依赖为了使用openai的stream模式来快速获取内容 -->
    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>okhttp-sse</artifactId>
    </dependency>
    <!-- 以下两个依赖为服务鉴权依赖 -->
    <dependency>
        <groupId>vip.yeee.memo</groupId>
        <artifactId>common-app-auth-server</artifactId>
    </dependency>
    <dependency>
        <groupId>vip.yeee.memo</groupId>
        <artifactId>common-app-auth-client</artifactId>
    </dependency>
    ...
</dependencies>

3.2 编写WebSocket端点Endpoint

添加WebSocket的支持后,我们需要编写具体的端点事件方法,如OnOpen、OnMessage等事件,用于实现消息的接收和发送逻辑。

@Component
@ServerEndpoint(path = "/ws/airobot/{chatId}", port = "8802", readerIdleTimeSeconds = "15")
public class ChatAppWebSocket {
   

    @Autowired
    private ApiChatGptBiz apiChatGptBiz;

    // ws打开时触发
    @OnOpen
    public void onOpen(Session session, HttpHeaders headers, @PathParam("chatId") String chatId) {
   
        apiChatGptBiz.handleWsOnOpen(session, headers, chatId);
    }

    // 收到客户端ws消息时触发
    @OnMessage
    public void onMessage(Session session, String msg) {
   
        apiChatGptBiz.handleWsOnMessage(session, msg);
    }

    // 客户端ws连接关闭时触发
    @OnClose
    public void onClose(Session session) throws IOException {
   
        apiChatGptBiz.handleWsOnClose(session);
    }

    // 这里主要处理netty的一些事件,如读超时、写超时,可以方便实现心跳检测
    @OnEvent
    public void onEvent(Session session, Object evt) {
   
        apiChatGptBiz.handleWsOnEvent(session, evt);
    }

}

3.3 集成ChatGPT模型

根据你的ChatGPT模型实现,添加相关代码将模型集成到服务端中。你可以使用开源的ChatGPT模型,或自行训练一个模型。
具体实现将模型集成到服务端的步骤和代码,根据你使用的具体ChatGPT模型会有所不同,请参考相应的文档和示例。
这里主要调用的是openai的api接口,代码如下:

@Component
public class OpenaiApiService {
   

    @Autowired
    private OkHttpClient okHttpClient;
    @Autowired
    private OkHttp3Kit okHttp3Kit;

    // 使用okhttp的sse请求模式来调用会话接口,流式调用的话阻塞影响小性能比较好
    public EventSource chatCompletions(Map<String, String> headers, ChatParams params, EventSourceListener eventSourceListener) {
   
        try {
   
            EventSource.Factory factory = EventSources.createFactory(okHttpClient);
            ObjectMapper mapper = new ObjectMapper();
            String requestBody = mapper.writeValueAsString(params);
            Request request = new Request.Builder()
                    .url(getApiHost() + "/v1/chat/completions")
                    .post(RequestBody.create(MediaType.parse(ContentType.JSON.getValue()), requestBody))
                    .headers(Headers.of(headers))
                    .build();
            return factory.newEventSource(request, eventSourceListener);
        } catch (Exception e) {
   
            throw new BizException("chatCompletions error");
        }
    }
}

3.4 实现业务逻辑

根据你的需求,实现业务逻辑。此处的业务逻辑是处理用户输入的消息,在服务端调用ChatGPT模型生成回复,并将回复发送给客户端。

@Service
public class ChatService {
   

    ...

    public void doWsChat(String msg, String chatId, String uid) {
   
        WsEventSourceListener listener = new WsEventSourceListener(chatId, uid, msg);

        String limitUserKey = StrUtil.isNotBlank(chatRedisRepository.getUserOpenIdCache(uid)) ? chatRedisRepository.getUserOpenIdCache(uid) : uid;

        if (!this.checkLimit(uid, msg, limitUserKey, listener)) {
   
            return;
        }

        ...

        ChatParams params = new ChatParams();
        List<ChatMessage2> messages = ChatLocalRepository.getChatContext(chatId, chatRedisRepository.getPreRecordCount());
        ChatMessage2 chatMessage2 = this.buildUserMessage(msg);
        messages.add(chatMessage2);
        params.setMessages(messages);
        params.setUser(authService.getUserId());
        params.setStream(true);
        listener.setStartTime(new Date());
        EventSource eventSource = openaiApiService.chatCompletions(headers(), params, listener);
        listener.setEventSource(eventSource);
        ChatAppWsContext.setUserRecentESL(chatId, uid, listener);
    }

    ...

}

4. 客户端开发

4.1 使用UniApp微信小程序/H5

    ...
    // 与服务器建立连接
    vm.ws = uni.connectSocket({
   
        url: vm.baseWsAddr + '/ws/airobot/' + vm.chatId,
        header: {
   
            'Utoken': 'Bearer ' + t
        },
        complete: () => {
   
        }
    })
    // 处理服务器返回的消息
    vm.ws.onMessage(function (e) {
   
        ...
    })
    vm.ws.onOpen(function (e) {
   
        console.log('ws open')
        setInterval(function() {
   
            if (vm.ws) {
   
                vm.ws.send({
   
                    data: 'ping'
                })
            }
        }, 5000);
    })
...

4.2 客户端效果预览

  • 微信小程序

    chatgpt_preview.png

  • H5网页版

    chatgpt_preview2.png

5. 总结

本文详细介绍了如何基于Java + Spring Boot + Netty + WebSocket技术栈搭建一个ChatGPT程序,并使用Uniapp开发微信小程序和H5作为客户端。通过完成这个项目,你可以搭建一个功能强大的聊天机器人系统,满足用户的各种需求。希望这篇文章能够帮助你顺利完成ChatGPT程序的搭建与开发!

  • Github完整代码DEMO
https://gitee.com/yeeevip/yeee-chatgpt

https://github.com/yeeevip/yeee-chatgpt
目录
相关文章
|
5月前
|
XML 人工智能 Java
优化SpringBoot程序启动速度
本文介绍了三种优化SpringBoot启动速度的方法:1) 延迟初始化Bean,通过设置`spring.main.lazy-initialization`为true,将耗时操作延后执行;2) 创建扫描索引,利用`spring-context-indexer`生成@ComponentScan的索引文件,加速类扫描过程;3) 升级至最新版SpringBoot,享受官方性能优化成果。这些方法能显著提升程序编译与启动效率。
1197 0
|
5月前
|
网络协议 Java
在SpringBoot项目中使用Netty实现远程调用
本文介绍了使用Netty解决网络连接性能问题的方法,重点讲解了Netty的NIO特性及其在SpringBoot中的应用。Netty作为高效的NIO框架,支持非阻塞IO,能通过单线程管理多个客户端连接,简化TCP/UDP套接字服务器开发。文章详细展示了Netty在SpringBoot中实现远程调用的过程,包括服务端与客户端代码实现、依赖配置及测试验证。通过示例代码,如`NettyServer`、`NettyClientUtil`等,清晰说明了Netty的工作原理和实际应用,解决了半包等问题,并提供了完整的测试结果。
587 3
|
6月前
|
Java
SpringBoot快速搭建WebSocket服务端和客户端
由于工作需要,研究了SpringBoot搭建WebSocket双向通信的过程,其他的教程看了许多,感觉讲得太复杂,很容易弄乱,这里我只展示快速搭建过程。
1810 1
|
6月前
|
供应链 JavaScript BI
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
这是一款专为小微企业打造的 SaaS ERP 管理系统,基于 SpringBoot+Vue+ElementUI+UniAPP 技术栈开发,帮助企业轻松上云。系统覆盖进销存、采购、销售、生产、财务、品质、OA 办公及 CRM 等核心功能,业务流程清晰且操作简便。支持二次开发与商用,提供自定义界面、审批流配置及灵活报表设计,助力企业高效管理与数字化转型。
540 2
ERP系统源码,基于SpringBoot+Vue+ElementUI+UniAPP开发
|
8月前
|
JavaScript 前端开发 Java
Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use;端口冲突的原理与解决方案
本文解决了Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use的问题,并通过介绍端口的使用原理和操作系统的端口管理机制,可以更有效地解决端口冲突问题,并确保Web服务器能够顺利启动和运行。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
消息中间件 XML 前端开发
springBoot集成websocket实时消息推送
本文介绍了如何在Spring Boot项目中集成WebSocket实现实时消息推送。首先,通过引入`spring-boot-starter-websocket`依赖,配置`WebSocketConfig`类来启用WebSocket支持。接着,创建`WebSocketTest`服务器类,处理连接、消息收发及错误等事件,并使用`ConcurrentHashMap`管理用户连接。最后,前端通过JavaScript建立WebSocket连接,监听消息并进行相应处理。此方案适用于需要实时通信的应用场景,如聊天室、通知系统等。
1164 2
|
开发框架 前端开发 网络协议
Spring Boot结合Netty和WebSocket,实现后台向前端实时推送信息
【10月更文挑战第18天】 在现代互联网应用中,实时通信变得越来越重要。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为客户端和服务器之间的实时数据传输提供了一种高效的解决方案。Netty作为一个高性能、事件驱动的NIO框架,它基于Java NIO实现了异步和事件驱动的网络应用程序。Spring Boot是一个基于Spring框架的微服务开发框架,它提供了许多开箱即用的功能和简化配置的机制。本文将详细介绍如何使用Spring Boot集成Netty和WebSocket,实现后台向前端推送信息的功能。
2875 1
|
前端开发 Java C++
RSocket vs WebSocket:Spring Boot 3.3 中的两大实时通信利器
本文介绍了在 Spring Boot 3.3 中使用 RSocket 和 WebSocket 实现实时通信的方法。RSocket 是一种高效的网络通信协议,支持多种通信模式,适用于微服务和流式数据传输。WebSocket 则是一种标准协议,支持全双工通信,适合实时数据更新场景。文章通过一个完整的示例,展示了如何配置项目、实现前后端交互和消息传递,并提供了详细的代码示例。通过这些技术,可以大幅提升系统的响应速度和处理效率。
|
前端开发 网络协议
netty整合websocket(完美教程)
本文是一篇完整的Netty整合WebSocket的教程,介绍了WebSocket的基本概念、使用Netty构建WebSocket服务器的步骤和代码示例,以及如何创建前端WebSocket客户端进行通信的示例。
1405 2
netty整合websocket(完美教程)
【JAVA】如何基于Netty实现简单的RPC 框架
【JAVA】如何基于Netty实现简单的RPC 框架
255 0
【JAVA】如何基于Netty实现简单的RPC 框架

热门文章

最新文章