zoukankan      html  css  js  c++  java
  • Java+Vue实现WebSocket

    一、添加WebSocketConfig配置类

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.socket.server.standard.ServerEndpointExporter;
    
    
    /**
    * 开启WebSocketConfig
    * @author: xuyanqi
    */
    @Configuration
    public class WebSocketConfig {
        @Bean
        public ServerEndpointExporter serverEndpointExporter(){
            return new ServerEndpointExporter();
        }
    }
    
    

    二、创建WebSocket服务处理类

    import cn.hutool.log.Log;
    import cn.hutool.log.LogFactory;
    import com.alibaba.fastjson.JSONObject;
    import com.elephant.framework.galaxy.travel.response.R;
    import org.springframework.stereotype.Component;
    
    
    import javax.websocket.*;
    import javax.websocket.server.PathParam;
    import javax.websocket.server.ServerEndpoint;
    import java.io.IOException;
    import java.util.concurrent.CopyOnWriteArraySet;
    
    /**
    *  服务处理类
    *  @author: xuyanqi
    */
    
    @ServerEndpoint("/websocket/{sid}")
    @Component
    public class WebSocketServer {
        static Log log = LogFactory.get(WebSocketServer.class);
        //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
        private static int onlineCount = 0;
        //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
        private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<WebSocketServer>();
    
    
        //与某个客户端的连接会话,需要通过它来给客户端发送数据
        private Session session;
    
    
        //接收sid  用了标识哪个模块的通信
        private String sid="";
        /**
         * 连接建立成功调用的方法*/
        @OnOpen
        public void onOpen(Session session,@PathParam("sid") String sid) {
            this.session = session;
            webSocketSet.add(this);     //加入set中
            addOnlineCount();           //在线数加1
            log.info("有新窗口开始监听:"+sid+",当前在线人数为" + getOnlineCount());
            this.sid=sid;
            try {
                sendMessage("连接成功");
            } catch (IOException e) {
                log.error("websocket IO异常");
                e.printStackTrace();
            }
        }
    
    
        /**
         * 连接关闭调用的方法
         */
        @OnClose
        public void onClose() {
            webSocketSet.remove(this);  //从set中删除
            subOnlineCount();           //在线数减1
            log.info("有一连接关闭!当前在线人数为" + getOnlineCount());
        }
    
    
        /**
         * 收到客户端消息后调用的方法
         *
         * @param message 客户端发送过来的消息*/
        @OnMessage
        public void onMessage(String message, Session session) {
            log.info("收到来自窗口"+sid+"的信息:"+message);
            //群发消息
            for (WebSocketServer item : webSocketSet) {
                try {
                    item.sendMessage(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
    
        /**
         *
         * @param session
         * @param error
         */
        @OnError
        public void onError(Session session, Throwable error) {
            log.error("发生错误");
            error.printStackTrace();
        }
        /**
         * 实现服务器主动推送
         */
        public void sendMessage(Object obj) throws IOException {
            R r = new R(obj);
            this.session.getBasicRemote().sendText(JSONObject.toJSONString(r));
        }
    
    
    
    
        /**
         * 群发自定义消息
         * */
        public static void sendInfo(Object obj,@PathParam("sid") String sid) throws IOException {
            log.info("推送消息到窗口"+sid+",推送内容:"+obj);
            for (WebSocketServer item : webSocketSet) {
                try {
                    //这里可以设定只推送给这个sid的,为null则全部推送
                    if(sid==null) {
                        item.sendMessage(obj);
                    }else if(item.sid.equals(sid)){
                        item.sendMessage(obj);
                    }
                } catch (IOException e) {
                    continue;
                }
            }
        }
    
    
        public static synchronized int getOnlineCount() {
            return onlineCount;
        }
    
    
        public static synchronized void addOnlineCount() {
            WebSocketServer.onlineCount++;
        }
    
    
        public static synchronized void subOnlineCount() {
            WebSocketServer.onlineCount--;
        }
    }
    
    

    三、vue前端

    在data中创建websock对象

    /**
    * 创建websocket
    */
    initWebSocket(){
        console.log("创建WebSocket")
        this.websock = new WebSocket("ws://127.0.0.1:9998/websocket/ydsj")
        this.websock.onmessage = this.websocketonmessage
        this.websock.onerror = this.websocketonerror
        this.websock.onopen = this.websocketonopen
        this.websock.onclose = this.websocketclose
    
    },
    // 连接建立之后执行send方法发送数据
    websocketonopen () {
       let data = {
         code: 0,
         msg: '这是client:初次连接'
       }
       this.websocketsend(data)
    },
    websocketonerror () {
      console.log( 'WebSocket连接失败')
    },
    // 数据接收
    websocketonmessage (e) {
       console.log('数据接收' + e.data)
    },
    // 数据发送
    websocketsend (Data) {
       this.websock.send(Data)
    },
    // 关闭
    websocketclose (e) {
       console.log('已关闭连接', e)
    }
    
    
  • 相关阅读:
    07.消除过期对象的引用
    1.1进程和多线程概述
    1.2什么是操作系统
    06.避免创建不必要的对象
    05.依赖注入优先于硬连接资源
    04.使用私有构造器执行非实例化
    03.使用私有构造方法或枚类实现 Singleton 属性
    02.当构造参数过多时使用builder模式
    01.考虑使用静态工厂方法替代构造方法
    iiS申请地址
  • 原文地址:https://www.cnblogs.com/xyqbk/p/13582993.html
Copyright © 2011-2022 走看看