zoukankan      html  css  js  c++  java
  • java集成WebSocket向所有用户发送消息

    package com.reading.controller.library;

    import org.springframework.stereotype.Controller;
    import org.springframework.web.socket.server.standard.SpringConfigurator;

    import javax.websocket.*;
    import javax.websocket.server.PathParam;
    import javax.websocket.server.ServerEndpoint;
    import java.util.concurrent.CopyOnWriteArraySet;

    /**
     * Created by zz on 2018/9/6.
     */
    @ServerEndpoint(value = "/websocket/{id}",configurator = SpringConfigurator.class)
    public class MyWebSocket {
        //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
        private static int onlineCount = 0;
        public MyWebSocket() {
        }
        //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。
        // 若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
        private static CopyOnWriteArraySet<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>();
        //与客户端的连接会话,需要通过它来给客户端发送数据
        private Session session;
        /**
         * 连接建立成功调用的方法
         * @param session  可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
         */
        @OnOpen
        public void onOpen(Session session,EndpointConfig config,@PathParam("id") Integer id){
            this.session = session;
            //加入set中
            webSocketSet.add(this);
            //在线数加1
            addOnlineCount();
            System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
        }
        /**
         * 连接关闭调用的方法
         */
        @OnClose
        public void onClose(){
            //从set中删除
            webSocketSet.remove(this);
            //在线数减1
            subOnlineCount();
            System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
        }
        /**
         * 收到客户端消息后调用的方法
         * @param message 客户端发送过来的消息
         * @param session 可选的参数
         */
        @OnMessage
        public void onMessage(String message, Session session) {
            System.out.println("来自客户端的消息:" + message);
            //群发消息
            for(MyWebSocket item: webSocketSet){
    //            try {
    //                item.sendMessage(message);
    //            } catch (IOException e) {
    //                e.printStackTrace();
    //                continue;
    //            }
            }
        }
        /**
         * 发生错误时调用
         * @param session
         * @param error
         */
        @OnError
        public void onError(Session session, Throwable error){
            System.out.println("发生错误");
            error.printStackTrace();
        }

    /**
     * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
     * @param message
     * @throws IOException
     */
     public void sendMessage(String message){
        this.session.getAsyncRemote().sendText(message);
     }


        public static synchronized int getOnlineCount() {
            return onlineCount;
        }
        public static synchronized void addOnlineCount() {
            MyWebSocket.onlineCount++;
        }
        public static synchronized void subOnlineCount() {
            MyWebSocket.onlineCount--;
        }
    }

    T

  • 相关阅读:
    SQL 查询中 not in的改进,--not exists
    REST接口--转摘
    C#中@的用法总结(转)
    有感于哈工大matlab被限制使用
    Oracle CURRVAL应用限制
    oracle to_char()函数--数字型到字符型
    如何提交代码到git仓库
    cannot find module 'xxx' 解决办法
    DOM-基本概念及使用
    AJAX-同源策略 跨域访问
  • 原文地址:https://www.cnblogs.com/baobeiqi-e/p/9884715.html
Copyright © 2011-2022 走看看