• MyWSClientUtils(java websocket client)


    java 作为客户端

    依赖:

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-websocket</artifactId>
            </dependency>
    import com.google.common.cache.Cache;
    import com.google.common.cache.CacheBuilder;
    import icil.common.websocket.handler.WSClientHandler;
    import lombok.extern.slf4j.Slf4j;
    import javax.websocket.ContainerProvider;
    import javax.websocket.Session;
    import javax.websocket.WebSocketContainer;
    import java.net.URI;
    import java.util.concurrent.TimeUnit;
    
    /************************************
     * <pre>
     * @PACKAGE  : sea.common.websocket.handler
     * @Author   : Sea
     * @Date     : 2022/4/3 14:27
     * @Desc     :
     * @History  :
     * <pre/>
     ***********************************/
    @Slf4j
    public class MyWSClientUtils {
    
        private static String HEARTBEAT="ping";
        private static  Cache<String,Session> wsCache = CacheBuilder.newBuilder()
                .initialCapacity(3)
                .expireAfterWrite(10, TimeUnit.HOURS) //10h 防止无用的session
                .build();
    
        /**
         * @param uri "ws://192.168.18.51:7206/websocket/001/Sea/1"
         */
        public static synchronized Session connectWS(String uri){
            Session sessionInCache = wsCache.getIfPresent(uri);
            if(sessionInCache!=null&&sessionInCache.isOpen()){return sessionInCache;}
            try{
                if(sessionInCache!=null){sessionInCache.close();}
                log.info("start connect ws : {}",uri);
                WebSocketContainer container = ContainerProvider.getWebSocketContainer();
                //设置消息大小最大为20M
                container.setDefaultMaxBinaryMessageBufferSize(20*1024*1024);
                container.setDefaultMaxTextMessageBufferSize(20*1024*1024);
                // 客户端,开启服务端websocket。
                Session session = container.connectToServer(WSClientHandler.class,URI.create(uri));
                session.setMaxIdleTimeout(60*60*1000);// 1h
                session.getBasicRemote().sendText(HEARTBEAT);
                wsCache.put(uri,session);
                return  session;
              } catch (Exception ex) {
                ex.printStackTrace();
                log.warn("c出错了 connect ws:{} exp:{}",uri,ex);
            }
                return  null;
        }
    
        /**
         * @param msg
         * @param uri : "ws://192.168.18.51:7206/ws/001/xx/1"
         * @return
         */
        public static Boolean sendMsg(String msg,String uri) {
            try
            {
                Session session = connectWS(uri);
                session.getBasicRemote().sendText(msg);
                return true;
            }catch (Exception e){
                log.error("send msg exp:{}",e);
                return false;
            }
        }
    }
    package sea.common.websocket.handler;
    import lombok.extern.slf4j.Slf4j;
    import javax.websocket.*;
    
    /************************************
     * <pre>
     * @PACKAGE  : sea.common.websocket.handler
     * @Author   : Sea
     * @Date     : 2022/4/3 14:23
     * @Desc     :
     * @History  : who date todo
     * <pre/>
     ***********************************/
    @ClientEndpoint
    @Slf4j
    public class WSClientHandler {
        @OnOpen
        public void onOpen(Session session) {
            log.info("连接成功!"+session.getId());//上面默认是1h, 断了重新连接就就好
    //        new Thread(()->{
    //           try {
    //               while (true){
    ////                   Thread.sleep(5*60*1000l); //5min send heartbeat
    //                   Thread.sleep(3*1000l); //5min send heartbeat
    //                   session.getBasicRemote().sendText("ping");
    //               }
    //           }catch (Exception e){}
    //        }).start();
        }
        @OnMessage
        public void processMessage(String message,Session session) {
            log.info("ws client 接收推送消息"+message);
    
        }
        @OnError
        public void processError(Throwable t) {
            log.error("---ws client processError error---", t);
        }
    
        @OnClose
        public void processClose(Session session, CloseReason closeReason) {
            log.error(session.getId() + closeReason.toString());
        }
    }
  • 相关阅读:
    微信支付退款部分代码
    Raspberry PI 点亮LED
    Raspberry PI 摄像头
    RaspberryPI 3B系统烧录
    MySQL基础使用
    MySQL数据库管理系统概述
    Eclipse创建JAVA项目
    Brup Suite拦截https请求
    Github 第一个仓库
    python os模块主要函数
  • 原文地址:https://www.cnblogs.com/lshan/p/16566323.html
Copyright © 2020-2023  润新知