• 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

  • 相关阅读:
    mysql sql语句多表合并UNION ALL和UNION
    ajax向后台传递数组参数并将后台响应的数据赋值给一个变量供其它插件使用
    java web项目中后台控制层对参数进行自定义验证 类 Pattern
    java后台实体类设置默认值
    app连接线上数据库进行本地接口测试
    idea常用快捷键
    百度搜索小脚本
    有道翻译小脚本
    洛谷 P3275 [SCOI2011]糖果
    洛谷 P2048 BZOJ 2006 [NOI2010]超级钢琴
  • 原文地址:https://www.cnblogs.com/baobeiqi-e/p/9884715.html
Copyright © 2020-2023  润新知