使用websocket后端接入文心一言

本文介绍了如何在SpringBoot项目中使用WebSocket进行双向通信,特别是通过`OnMessage`事件处理用户消息并调用文心一言的大模型API,展示了从配置到实际应用的步骤和效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近再写项目练手,想着最近大模型那么火,也想接入项目来玩一玩,于是去了解了一下相关的api和通信协议,最后选择了文心一言进行集成,国内的相对稳定。ERNIE-Bot-turbo - 千帆大模型平台 | 百度智能云文档 (baidu.com)

使用websocket进行双向通信,因为http是单向协议显然不适合这样的场景。简单介绍一下websocket它是一个双向的通信协议,一旦通信双方建立联系,就可以互相发送消息。

 

http和websocket通信过程图

现在就开始进行配置吧,首先我们需要配置好websocket的的相关依赖已经配置serverEndpoint的扫描。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
@Configuration
public class WebSocketConfig
{
    @Bean
    public ServerEndpointExporter serverEndpointExporter()
    {
        return new ServerEndpointExporter();
    }
}

如此就将准备工作做好了,现在配置一下访问处理的server

@Component
@ServerEndpoint("/websocket/message")
public class WebSocketServer
{
    /**
     * 实现日志打印
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketServer.class);

    public static int socketMaxOnlineCount = 100;

    private static Semaphore socketSemaphore = new Semaphore(socketMaxOnlineCount);

    private List<BaiduChatMessage> userMessage[]=new List[2000];

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session) throws Exception
    {
        SemaphoreUtils.tryAcquire(socketSemaphore);
        LOGGER.info("\n 成功连接 - {}", session);
    }

    /**
     * 连接关闭时处理
     */
    @OnClose
    public void onClose(Session session)
    {
        LOGGER.info("\n 关闭连接 - {}", session);
        // 获取到信号量则需释放
        SemaphoreUtils.release(socketSemaphore);
    }

    /**
     * 抛出异常时处理
     */
    @OnError
    public void onError(Session session, Throwable exception) throws Exception
    {
        if (session.isOpen())
        {
            // 关闭连接
            session.close();
        }
        String sessionId = session.getId();
        LOGGER.info("\n 连接异常 - {}", sessionId);
        LOGGER.info("\n 异常信息 - {}", exception);
        // 获取到信号量则需释放
        SemaphoreUtils.release(socketSemaphore);
    }

    /**
     * 服务器接收到客户端消息时调用的方法
     */
    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        // 首先,接收到一条消息
        LOGGER.info("\n 收到消息 - {}", message);
        // 1. 调用大模型API,把上下文和这次问题传入,得到回复
        BigModelService bigModelService = new BigModelService();
        boolean f = bigModelService.callModelAPI(session,message,userMessage);
        if (!f) {
            session.getBasicRemote().sendText("抱歉,似乎出了点问题,请联系管理员");
            return;
        }
    }
}

都使用注解进行控制,其中这里最重要的就是 OnMessage,这个是得到websocket消息进行的处理,是最核心的方法,本次主要的业务实现焦距于本方法。

接下来就是将问题发送给文心一言的接口然后得到回应了

下面粘贴一下主代码

public boolean callModelAPI(Session session, String message, Map<String,List<BaiduChatMessage>> userMassage) {
        String records = "{}";
        ErnieBotTurboParam param = JSONObject.parseObject(records, ErnieBotTurboParam.class);
        //未将信息存入数据库,使用会话做一个简单的持久化
        if(userMassage.get(session.getId()) == null)
            userMassage.put(session.getId(),new ArrayList<>());
        //存入最新消息
        userMassage.get(session.getId()).add(BaiduChatMessage.builder().role("user").content(message).build());
        // 1.2.2 把messages重新设置到param中
        param.setMessages(userMassage.get(session.getId()));
        try {
            // 2. 发出请求,调用大模型API
            RequestBody body = RequestBody.create(MediaType.parse("application/json"), JSONObject.toJSONString(param));
            Request request = new Request.Builder()
                    .url("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=" + getAccessToken())
                    .method("POST", body)
                    .addHeader("Content-Type", "application/json")
                    .build();
            Response response = HTTP_CLIENT.newCall(request).execute();

            if (response.isSuccessful()) {
                //对返回信息进行处理
                try (ResponseBody responseBody = response.body()) {
                    if (responseBody != null) {
                        InputStream inputStream = responseBody.byteStream();
                        // 以流的方式处理响应内容
                        byte[] buffer = new byte[2048];
                        int bytesRead;
                        String ss="";
                        while ((bytesRead = inputStream.read(buffer)) != -1) {
                            // 在控制台输出每个数据块
                            String s[] = new String(buffer, 0, bytesRead).split("data: ");
                            int n=1;
                            while (n<s.length) {
                                System.out.println(s[n]);
                                TurboResponse turboResponse = JSONObject.parseObject(s[n++], TurboResponse.class);
                                ss+=turboResponse.getResult();
                                session.getBasicRemote().sendText(turboResponse.getResult());
                            }
                        }
                        userMassage.get(session.getId()).add(BaiduChatMessage.builder().role("assistant").content(ss).build());
                    }
                }
                return true;
            } else {
                LOGGER.error("调用大模型API失败: {}", response.message());
            }
        } catch (IOException e) {
            LOGGER.error("调用大模型API发生异常:", e);
        }
        return false;
    }

如此便实现了基本的通信服务,下面来看看效果

 

效果只能说够用 ,也还不错吧。

期待这篇文章可以帮助到大家

<think>好的,我现在需要帮用户找到后端如何接收前端通过WebSocket发送的数据的代码示例。用户提到了WebSocket,所以首先我得回忆一下WebSocket的基本概念和常见实现方式。WebSocket是一种全双工通信协议,允许前后端实时交互。常见的后端实现可能包括不同的编程语言,比如Node.js、Python、Java等,用户没有指定语言,可能需要提供多个例子或者选择一个常用的。 接下来,我需要考虑用户可能的场景。用户可能是后端开发者,需要集成WebSocket功能到现有系统中,或者正在学习如何实现实时通信功能。用户提到的是接收前端发送的数据,所以重点应该放在后端如何监听消息事件,处理接收到的数据,并可能给出回复的示例。 然后,我要检查系统级指令中的要求。必须使用中文回答,代码示例需要正确,并且要生成相关问题。同时,需要引用用户提供的参考内容中的引用标识,但用户给出的引用似乎和WebSocket关系不大,引用[1]提到了WebKit WebInspector和WebSocket,可能相关,但具体代码示例可能需要另外寻找。 首先,我应该提供不同后端语言的示例,比如Node.js使用WebSocket库或者Socket.io,Python使用Flask-SocketIO,Java使用Spring Boot的WebSocket支持。每个示例需要展示如何建立连接、监听消息、处理数据。 例如,Node.js可能使用ws库: ```javascript const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', (ws) => { ws.on('message', (message) => { console.log('收到消息: %s', message); ws.send('服务器已接收: ' + message); }); }); ``` 这里创建了一个WebSocket服务器,监听8080端口,当有连接建立时,监听message事件,接收到消息后打印并回复。 Python的Flask-SocketIO示例: ```python from flask import Flask from flask_socketio import SocketIO app = Flask(__name__) socketio = SocketIO(app, cors_allowed_origins="*") @socketio.on('message') def handle_message(message): print('收到消息:', message) socketio.send('服务器已接收: ' + message) if __name__ == '__main__': socketio.run(app, port=5000) ``` 这里使用Flask-SocketIO库,定义了一个处理消息的函数,当接收到消息时发送响应。 Java Spring Boot的例子: ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyHandler(), "/ws"); } class MyHandler extends TextWebSocketHandler { @Override public void handleTextMessage(WebSocketSession session, TextMessage message) { String payload = message.getPayload(); System.out.println("收到消息: " + payload); session.sendMessage(new TextMessage("服务器已接收: " + payload)); } } } ``` 这里通过Spring的WebSocket支持,注册了一个处理器,处理文本消息并回复。 接下来需要检查是否符合用户的引用。用户提供的引用[1]提到了DevToolsHttpHandler和WebSocket,可能涉及到调试工具使用WebSocket,但代码示例可能不直接相关。不过用户可能希望看到如何在后端处理WebSocket连接,所以以上示例应该是合适的。 然后生成相关问题,比如如何确保WebSocket连接的安全性,如何处理多个客户端同时连接,或者如何与前端配合使用。需要确保问题相关且有助于进一步学习。 最后,确保代码格式正确,使用正确的语法,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不需要数学公式,所以主要关注代码块和结构。</think>### WebSocket后端接收前端消息的实现示例 WebSocket是一种全双工通信协议,允许后端实时接收前端发送的数据。以下是不同语言的后端实现示例: #### 1. Node.js 使用 `ws` 库 ```javascript const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', (ws) => { ws.on('message', (message) => { console.log('Received:', message); ws.send(`Server received: ${message}`); }); }); ``` - **功能**:监听8080端口,接收消息并返回确认[^1] - **依赖安装**:`npm install ws` #### 2. Python 使用 `Flask-SocketIO` ```python from flask import Flask from flask_socketio import SocketIO app = Flask(__name__) socketio = SocketIO(app, cors_allowed_origins="*") @socketio.on('message') def handle_message(message): print('Received:', message) socketio.send(f'Server received: {message}') if __name__ == '__main__': socketio.run(app, port=5000) ``` - **功能**:通过事件驱动模型处理消息 - **依赖安装**:`pip install flask-socketio` #### 3. Java Spring Boot 实现 ```java @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyHandler(), "/ws"); } class MyHandler extends TextWebSocketHandler { @Override public void handleTextMessage(WebSocketSession session, TextMessage message) { String payload = message.getPayload(); System.out.println("Received: " + payload); session.sendMessage(new TextMessage("Server received: " + payload)); } } } ``` - **功能**:通过定义消息处理器实现双向通信 --- ### 核心实现步骤 1. **建立连接**:前端通过 `new WebSocket('ws://localhost:8080')` 连接后端 2. **监听消息**:后端通过事件监听(如 `onmessage` 或 `@OnMessage` 注解)捕获数据 3. **处理数据**:对接收的JSON/文本/二进制数据进行解析 4. **返回响应**:通过 `send()` 方法返回处理结果 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值