zoukankan      html  css  js  c++  java
  • websocket的stomp客户端,包含自动重连功能

    转载自: https://blog.csdn.net/k3108001263/article/details/88088882

    javascript版本

    <meta charset="UTF-8">
    <script type="text/javascript" src="http://cdn.bootcss.com/sockjs-client/1.1.1/sockjs.js"></script>
    <script type="text/javascript" src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.js"></script>
    <html>
    <body>
    <script>
    var stomp = null;//定义全局变量,表明一个session
    function connect(){    //定义链接函数
        if(stomp == null || !stomp.connected){    
            //var url = 'http://132.122.237.68:8164/websocket';
            var url = 'http://localhost:8164/websocket';
            //var url = '/websocket';
            var headers={
                "token":"admin_token"    
            };
            var sockJS = new SockJS(url);
            stomp = Stomp.over(sockJS);
            stomp.heartbeat.outgoing = 20000; //若使用STOMP 1.1 版本,默认开启了心跳检测机制(默认值都是10000ms)
            stomp.heartbeat.incoming = 0; //客户端不从服务端接收心跳包
            console.log("当前处于断开状态,尝试链接");
            stomp.connect(headers, connectCallback ,errorCallback );
        }else{
            console.log("当前处于链接状态");
        }
    }
    
    function connectCallback (frame) {  //链接成功时的回调函数
        stomp.subscribe("/topic/wechat/message/receiveText/12345", function (result) {  
            var content = result.body;
            console.log("接收订阅消息="   +content);
        }, {});       
    }
    function errorCallback(){//链接失败时的回调函数,此函数从新调用链接方法,造成循环,直到链接成功    
        connect();    
    }
    connect();//创建链接
    </script>
    </body>
    </html>

    java版本

    package com.github.qq275860560.wechat.client;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    import org.springframework.messaging.converter.StringMessageConverter;
    import org.springframework.messaging.simp.stomp.StompHeaders;
    import org.springframework.messaging.simp.stomp.StompSession;
    import org.springframework.messaging.simp.stomp.StompSessionHandler;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
    import org.springframework.util.concurrent.ListenableFuture;
    import org.springframework.web.socket.WebSocketHttpHeaders;
    import org.springframework.web.socket.client.standard.StandardWebSocketClient;
    import org.springframework.web.socket.messaging.WebSocketStompClient;
    import org.springframework.web.socket.sockjs.client.SockJsClient;
    import org.springframework.web.socket.sockjs.client.Transport;
    import org.springframework.web.socket.sockjs.client.WebSocketTransport;
    
    import lombok.extern.slf4j.Slf4j;
    
    /**
     * @author jiangyuanlin@163.com
     */
    @Slf4j
    public class ReceiveTextStompClient {
        private static String url = "http://132.122.237.244:8244/websocket";
        private static String token = "freeswitch_token";
        private static StompSession stompSession;// 定义全局变量,表明一个session
    
        public static void connect() {// 定义链接函数
            if (stompSession == null || !stompSession.isConnected()) {
                log.info("当前处于断开状态,尝试链接");
                List<Transport> transports = new ArrayList<>();
                transports.add(new WebSocketTransport(new StandardWebSocketClient()));
                SockJsClient sockJsClient = new SockJsClient(transports);
                WebSocketStompClient webSocketStompClient = new WebSocketStompClient(sockJsClient);
                webSocketStompClient.setMessageConverter(new StringMessageConverter());
                webSocketStompClient.setDefaultHeartbeat(new long[] { 20000, 0 });
                ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
                taskScheduler.afterPropertiesSet();
                webSocketStompClient.setTaskScheduler(taskScheduler);
                WebSocketHttpHeaders webSocketHttpHeaders = null;
                StompHeaders stompHeaders = new StompHeaders();
                stompHeaders.add("token", token);
                StompSessionHandler receiveTextStompSessionHandler = new ReceiveTextStompSessionHandler();
                try {
                    ListenableFuture<StompSession> future = webSocketStompClient.connect(url, webSocketHttpHeaders,
                            stompHeaders, receiveTextStompSessionHandler);
                    stompSession = future.get();
                    stompSession.setAutoReceipt(true);
                    stompSession.subscribe("/topic/wechat/message/receiveText/12345", receiveTextStompSessionHandler);
                    // stompSession.send("/app/wechat/message/sendText", jsonString.getBytes());
                } catch (Exception e) {
    
                }
            } else {
                log.info("当前处于链接状态");
            }
    
        }
    
        public static void main(String[] args) {// 创建链接
            while (stompSession == null || !stompSession.isConnected()) {
                connect();// 链接服务器
                try {
                    Thread.sleep(3000);// 链接服务器失败的处理 3秒后从新链接
                } catch (Exception e1) {
                }
            }
            new Scanner(System.in).nextLine();
        }
    
    }
    package com.github.qq275860560.wechat.client;
    
    import org.springframework.messaging.simp.stomp.StompHeaders;
    import org.springframework.messaging.simp.stomp.StompSession;
    import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter;
    
    import lombok.extern.slf4j.Slf4j;
    
    /**
     * @author jiangyuanlin@163.com
     */
    @Slf4j
    public class ReceiveTextStompSessionHandler extends StompSessionHandlerAdapter {
        @Override
        public void handleFrame(StompHeaders headers, Object payload) {
            log.info("接收订阅消息=" + (String) payload);
        }
    
        @Override
        public void handleTransportError(StompSession stompSession, Throwable exception) {
            log.error("",exception);
            //super.handleTransportError(stompSession, exception);
            try {
                Thread.sleep(3000);
                ReceiveTextStompClient.connect();
            } catch (InterruptedException e) {
                log.error("",e);
            }
        }
    }
  • 相关阅读:
    class-dump + DumpFrameworks.pl
    使用 U盘 重装 Mac OSX
    本地化应用程序
    UINavigationBar 总结
    Xcode 杂七杂八
    App 打包并跳过 AppStore 的发布下载
    Summary of Mac Versions
    QT5安装(null)
    如何实现LAN或WAN远程开机?
    DELL 8700重装系统
  • 原文地址:https://www.cnblogs.com/huaixiaonian/p/14474948.html
Copyright © 2011-2022 走看看