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

  • 相关阅读:
    《应用Yii1.1和PHP5进行敏捷Web开发》学习笔记(转)
    YII 小模块功能
    Netbeans代码配色主题大搜集
    opensuse 启动巨慢 解决方法 90s多
    opensuse 安装 网易云音乐 rpm netease music
    linux qq rpm deb opensuse
    openSUSE 安装 alien
    第一行代码 Android 第2版
    Android Studio AVD 虚拟机 联网 失败
    docker error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.29/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuratio
  • 原文地址:https://www.cnblogs.com/baobeiqi-e/p/9884715.html
Copyright © 2011-2022 走看看