springboot搭建webSocket对话

现在AI工具这么火自己也整一个AI对话框,需要用到webSocket
如何接入ai组件可参考java对接阿里云通义千问API多轮对话承接上下文
1.maven添加jar包

<dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2.创建WebSocketConfig

package com.ruoyi.web.controller.app;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
public class WebSocketConfig {
    
    
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
    
    
        return new ServerEndpointExporter();
    }
}

3.创建WebSocketServer

package com.ruoyi.web.controller.app;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONObject;

@Component
@ServerEndpoint("/webSocket/{username}")
public class WebSocketServer {
    
    
    /**
     * 该map用来存放每个用户对应的Session对象。
     */
    private static Map<String, Session> clients = new ConcurrentHashMap<>();

    
    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(@PathParam("username") String username, Session session) throws IOException {
    
    
        if (username == null) {
    
    
            return;
        }
        clients.put(username, session);
        System.out.println("用户:" + username + "连接到websocke");
    }
    
    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(@PathParam("username") String username) throws IOException {
    
    
        clients.remove(username);
        System.out.println("用户:" + username + "断开websocket");
    }

    @OnMessage
    public void onMessage(String json) throws IOException {
    
    
        System.out.println("前端发送的信息为:" + json);
        JSONObject jsonObject = JSONObject.parseObject(json);
        String user = jsonObject.getString("user");
        String msg = jsonObject.getString("msg");
        Session session = clients.get(user);
        //如果这个好友在线就直接发给他
        if (session != null) {
    
    
            sendMessageTo(msg,session);
        } else {
    
    
            System.out.println("对方不在线,对方名字为:" + user);
        }
    }
    
    /**
     * 出现异常触发的方法
     */
    @OnError
    public void onError(Session session, Throwable error) {
    
    
        error.printStackTrace();
    }

    /**
     * 单发给某人
     */
    public void sendMessageTo(String message, Session session) throws IOException {
    
    
        session.getBasicRemote().sendText(message);
    }
}

4.开始测试
代码写完后启动springboot开始测试
使用ApiPost工具进行测试
ws://localhost:80/webSocket/张三
用户张三链接到webSocket服务
张三向李四发送json数据{“msg”:“天王盖地虎。”,“user”:“李四”}
在这里插入图片描述
ws://localhost:80/webSocket/李四
李四也链接webSocket服务
这里可以看到接收的数据
并回复{“msg”:“小鸡炖蘑菇。”,“user”:“张三”}给张三
在这里插入图片描述
张三这边也对上了暗号对话完成。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/woshiabc111/article/details/134659725