SpringBoot集成websocket(3)|(websocket调用websocket采用回调方式实现数据互传)

这篇具有很好参考价值的文章主要介绍了SpringBoot集成websocket(3)|(websocket调用websocket采用回调方式实现数据互传)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringBoot集成websocket(3)|(websocket调用websocket采用回调方式实现数据互传)


章节
第一章链接: SpringBoot集成websocket(1)|(websocket客户端实现)
第二章链接: SpringBoot集成websocket(2)|(websocket服务端实现以及websocket中转实现)

前言

本节主要介绍的是springboot实现websocket的客户端服务端,以及客户端与服务端的数据互传。以下为伪代码,业务逻辑删除导致不能直接拷贝运行,大家可以参考其中的思路实现。

一、websocket服务端依赖引入

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

二、websocket服务代码实现

1.WebSocketConfig配置

springboot接入websocket需要启用对应的配置

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

2.WebSocketServer服务实现

springboot提供对外的websocket接口实现


@Component
@Data
@Slf4j
@ServerEndpoint(value = "/v1/chat")
public class DocChatServer {

    public final static String CHAT_ERR_MSG_FORMAT = "{\"header\":{\"code\":10001,\"message\":\"参数格式不对\",\"sId\":\"%s\",\"status\":2}}";

    @Autowired
    private void setOriginMessageSender() {
    // 初始化注入bean 隐藏掉了
    }


    @OnOpen
    public void OnOpen(Session session) {
        log.debug("chat websocket open ");
    }


    @OnClose
    public void OnClose() {
        log.debug("chat websocket close ");
    }

    @OnMessage
    public void OnMessage(Session session, String message) {
        SearchDocParamVo param = null;
        log.debug("ApiRequest = {}", message);
        // 参数校验
        try {
            JSONObject jsonObject = JSONObject.parseObject(message);
            // todo  参数校验
        } catch (Exception e) {
            String errMsg = String.format(CHAT_ERR_MSG_FORMAT, session.getId());
            log.error("chat请求参数格式不会:{},异常:{}", errMsg, e);
            send(session, errMsg);
            return;
        }
        // todo 业务处理
        List<ChatRecord.Source> sources = Lists.newArrayList();;
        String prompt = "";
        // 谈话接口
        queryChat(session, param, prompt, sources);

    }


    /**
     * 执行谈话
     *
     * @param session
     * @param param
     * @param prompt
     * @param sources
     */
    private void queryChat(Session session, SearchDocParamVo param, String prompt, List<ChatRecord.Source> sources) {
       // todo 业务处理 。。。
        // 消息发送
        try {
            boolean b = this.sendChatMessage(session, param, sources, texts);
            if (!b) {
                List<Text> textsTry = Lists.newArrayList();
                Text build1 = Text.builder()
                        .role("user")
                        .content("请更具自己的理解回答问题:" + param.getContent())
                        .build();
                textsTry.add(build1);
                this.sendChatMessage(session, param, sources, textsTry);
            }
        } catch (Exception e) {
            log.error("发送消息异常:{}", e.getMessage());
        }
    }

    /**
     * 收到谈话响应数据处理
     *
     * @param session
     * @param param
     * @param sources
     * @param texts
     * @return
     */
    private boolean sendChatMessage(Session session, SearchDocParamVo param, List<ChatRecord.Source> sources, List<Text> texts) {
        ChatClient4Chat planetClient4Chat = new ChatClient4Chat(websocketConfigConst);
        try {
            planetClient4Chat.send(param, texts, new ApiResponseObserver() {
                public void onReceive(String message) {
                    // 收到远程websocket服务响应的数据
                }

                public void onError(Throwable throwable) {
                    log.error("收到错误:{}", throwable);

                }

                public void onCompleted() {
                    log.error("收到结束");
                }
            });
            // 以下是业务逻辑   可忽略
            for (int i = 0; i < 100; i++) {
                if (planetClient4Chat.isHasCheck()) {
                    log.debug("has check");
                    return planetClient4Chat.isSuccess();
                } else {
                    Thread.sleep(500);
                }
            }

        } catch (Exception e) {
            log.error("发送消息异常:{}", e.getMessage());
        }
        return true;
    }


    public void send(Session session, String msg) {
        synchronized (session) {
            if (!session.isOpen()) {
                log.error("客户端连接关闭,数据不发送:{}", msg);
                return;
            }
            try {
                session.getBasicRemote().sendText(msg);
            } catch (IOException ex) {
                log.error("传递消息给客户端异常:{}", ex.getMessage());
            }
        }
    }

    public int getStatus(String message) {
        int status = -1;
        try {
			//todo 业务逻辑
            return choices.getStatus();
        } catch (Exception e) {
            log.error("数据中提取status异常:{}", e);
        }
        return status;
    }




    @OnError
    public void onerror(Session session, Throwable throwable) {
        log.error("chat连接异常关闭:远程主机强迫关闭了一个现有的连接:{}", throwable);
    }



}

3.ChatClient4Chat连接工具实现

springboot提供对中间衔接工具了,连接第三饭websocket接口
实现代码如下

@Slf4j
@Getter
@Setter
public class ChatClient4Chat {
    private static WebsocketConfigConst websocketConfigConst;
    private StringBuilder stringBuilder;
    private boolean hasCheck;
    private boolean success;
    private Queue<String> queue;
    private ChatChatServer sparkChatServer;

    ChatClient4Chat(WebsocketConfigConst websocketConfigConst) {
        this.websocketConfigConst = websocketConfigConst;
        this.stringBuilder = new StringBuilder();
        this.hasCheck = false;
        this.success = true;
        this.queue = new LinkedList<String>();

    }

    /**
     * 执行聊天
     *
     * @param param
     */
    public void send(SearchDocParamVo param, List<Text> texts, ApiResponseObserver apiResponseObserver) {
        // 获取连接
        ChatChatServer chatServer = (ChatChatServer ) getWebSocketClient(apiResponseObserver);
        if (chatServer != null && chatServer.isOpen()) {
            this.sparkChatServer = chatServer;
            // 消息发送
            try {
                chatServer.send(SparkHand.initParam(param, texts, websocketConfigConst.type, websocketConfigConst.appid, websocketConfigConst.token));
            } catch (Exception e) {
                log.error("发送消息异常:{}", e.getMessage());
            }
        } else {
            log.error("接口连接未打开");
        }
    }

    public void close() {
        // 获取连接
        if (sparkChatServer != null && sparkChatServer.isOpen()) {
            sparkChatServer.close();
        } else {
            log.error("接口连接未打开,关闭异常");
        }
    }


    private void waitConnect() {
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            log.error("等待连接异常");
        }
    }

    private WebSocketClient getWebSocketClient(ApiResponseObserver apiResponseObserver) {
        WebSocketClient client = new SparkChatServer(websocketConfigConst.chaturl, apiResponseObserver);
        client.connect();
        waitConnect();
        return client;
    }
}

ApiResponseObserver 是一个定义的接口,规范一些方法

public interface ApiResponseObserver extends ResponseObservable<String> {
}

public interface ResponseObservable<T> {
    void onReceive(T response);

    void onError(Throwable throwable);

    void onCompleted();
}

3.WebSocketClient连接第三方客户端实现

springboot提供对第三方websocket连接的客户端
实现代码如下

@Slf4j
public class SparkChatServer extends WebSocketClient {
    private ApiResponseObserver apiResponseObserver;

    public SparkChatServer(URI serverUri, ApiResponseObserver apiResponseObserver) {
        super(serverUri);
        this.apiResponseObserver = apiResponseObserver;
    }

    @Override
    public void onOpen(ServerHandshake serverHandshake) {
        log.debug("chat 服务连接成功");
    }

    @Override
    public void onMessage(String message) {
        log.debug("收到chat数据{}", message);
        apiResponseObserver.onReceive(message);

    }

    @Override
    public void onClose(int i, String s, boolean b) {
        log.debug("退出chat连接");
    }

    @Override
    public void onError(Exception e) {
        log.error("chat连接出现异常:{}", e);

    }
}


总结

本文主要介绍websocket客户端、服务端的实现,同时通过连接工具中转websocket请求参数,捉到实时同步,以及数据收集。代码为伪代码,删除了实际使用当中的业务逻辑,介绍的是实现实录,大家可以参考。

第一章链接: SpringBoot集成websocket(1)|(websocket客户端实现)
第二章链接: SpringBoot集成websocket(2)|(websocket服务端实现以及websocket中转实现)文章来源地址https://www.toymoban.com/news/detail-664660.html

到了这里,关于SpringBoot集成websocket(3)|(websocket调用websocket采用回调方式实现数据互传)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot集成websocket(4)|(使用okhttp3实现websocket)

    章节 第一章链接: SpringBoot集成websocket(1)|(websocket客户端实现) 第二章链接: SpringBoot集成websocket(2)|(websocket服务端实现以及websocket中转实现) HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。OkHttp是一个高效的HTTP客户

    2024年02月10日
    浏览(39)
  • SpringBoot集成WebSocket实现及时通讯聊天功能!!!

    注意:   至此,后端代码就集成完了,集成完之后,记得重启你的Springboot项目 前端Vue 1:新建Vue 页面  路由: 代码:路由根据你项目的实际情况写 在用户登录的时候,需要将你的用户名存储到本地Session 中  效果图:  用户甲:   用户乙:   注:网上学习来源 SpringBoot集

    2024年02月01日
    浏览(40)
  • 使用SpringBoot集成的WebSocket实现长连接

    实现WebSocketConfigurer接口的类只能生效一个,使用时要避免多个类实现WebSocketConfigurer接口。 实现WebSocketConfigurer接口,实现registerWebSocketHandlers()方法,配置处理类,连接路径,作用域,拦截器等。 将拦截器HandshakeInterceptor 作为内部类写在配置类里,分别是前置拦截和后置拦截

    2024年01月20日
    浏览(43)
  • SpringBoot集成WebSocket,实现后台向前端推送信息

    在一次项目开发中,使用到了Netty网络应用框架,以及MQTT进行消息数据的收发,这其中需要后台来将获取到的消息主动推送给前端,于是就使用到了MQTT,特此记录一下。 WebSocket协议是基于TCP的一种新的网络协议。它实现了客户端与服务器全双工通信,学过计算机网络都知道

    2024年01月16日
    浏览(45)
  • Springboot集成websocket实现消息推送和在线用户统计

    在启动类上添加一个bean 核心代码 实现消息推送只要在业务代码中调用sendMessageSpecial()方法即可。 然后调用刚才的业务接口测试:http://localhost:8080/websocket/t1 调用成功后可以看到三个窗口中都收到了消息

    2023年04月08日
    浏览(53)
  • SpringBoot集成WebSocket实现客户端与服务端通信

    话不多说,直接上代码看效果! 一、服务端: 1、引用依赖 2、添加配置文件 WebSocketConfig 3、编写WebSocket服务端接收、发送功能   声明接口代码:   实现类代码: 4、如果不需要实现客户端功能,此处可选择前端调用,奉上代码 二、客户端: 1、引用依赖 2、自定义WebSocket客

    2024年01月23日
    浏览(52)
  • SpringBoot集成WebSocket实现消息实时推送(提供Gitee源码)

    前言:在最近的工作当中,客户反应需要实时接收消息提醒,这个功能虽然不大,但不过也用到了一些新的技术,于是我这边写一个关于我如何实现这个功能、编写、测试到部署服务器,归纳到这篇博客中进行总结。 目录 一、什么是WebSocket 二、后端实现 2.1、引入pom.xml依赖

    2024年02月11日
    浏览(43)
  • Springboot + Websocket的集成实现简单的聊天室功能

    WebSocket是一种网络通信协议,它可以在单个TCP连接上实现双向(全双工)通信。WebSocket使用HTML5标准,并且可以在客户端和服务器之间建立持久连接,这意味着连接在浏览器刷新或关闭后仍然保持打开状态。 WebSocket的主要优点包括: 1. 双向通信:WebSocket支持客户端和服务器之

    2024年03月21日
    浏览(45)
  • SpringBoot和Vue2集成WebSocket,实现聊天室功能

    springboot集成websocket实现聊天室的功能。如有不足之处,还望大家斧正。

    2024年01月23日
    浏览(45)
  • SpringBoot集成WebSocket实现客户端与服务端长连接通信

    场景: 1、WebSocket协议是用于前后端长连接交互的技术,此技术多用于交互不断开的场景。特点是连接不间断、更轻量,只有在关闭浏览器窗口、或者关闭浏览器、或主动close,当前会话对象才会关闭。 2、相较于 Http/Https 通信只能由客户端主动发起请求,而 Socket 通信不仅能

    2024年02月02日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包