美文网首页
Websocket初探

Websocket初探

作者: 禾叶super | 来源:发表于2019-12-05 18:08 被阅读0次

    Websocket是一种在单个TCP连接上进行全双工通信的网络协议,是HTML5新增的协议。那么为何要使用Websocket呢。如果你遇到过这样的情况,那么可能更好理解。

    场景:想要获取服务器定时发送的消息,然后显示到页面上。你会怎么处理?使用ajax轮询吗,不断的去询问服务器,有消息了吗,给我吧。这种方式是非常消耗资源的,而且很难控制轮询什么时候结束。而使用Websocket之后,可以在浏览器和服务器之间建立一个不受限的双向通信的通道,服务器可以主动把消息推送给前端。

    那么接下来就让我们来看看Websocket的使用实例吧。
    服务器端:

    @ServerEndpoint("/websocket/{username}")
    public class WebSocket {
        private static int onlineCount = 0;
        private static CopyOnWriteArrayList<Map<String, WebSocket>> clients = new CopyOnWriteArrayList<>();
        //与某个客户端的连接会话,需要通过它来给客户端发送数据
        private Session session;
        private String userName;
    
        /**
         * [连接建立成功调用的方法]
         */
        @OnOpen
        public void onOpen(@PathParam("username") String userName, Session session){
            this.userName = userName;
            this.session = session;
            Map<String, WebSocket> map = new ConcurrentHashMap<>();
            map.put(userName,this);
            clients.add(map);
            addOnlineCount();           //在线数加1
            System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
        }
    
        /**
         * [关闭连接调用的方法]     
         */
        @OnClose
        public void onClose(){
            for (Map<String, WebSocket> map:clients) {
                map.remove(userName);
            }
            subOnlineCount();
        }
    
        @OnMessage
        public void onMessage(String message){
            for (Map<String, WebSocket> map:clients) {
                for (WebSocket item : map.values()) {
                    item.session.getAsyncRemote().sendText(message);
                }
            }
    
        }
    
        /**
         * [连接发送错误]
         */
        @OnError
        public void onError(Session session, Throwable error){
            System.out.println("发生错误");
            error.printStackTrace();
        }
    
        public static synchronized int getOnlineCount() {
    
            return onlineCount;
    
        }
    
        public static synchronized void addOnlineCount() {
    
            WebSocket.onlineCount++;
    
        }
    
        public static synchronized void subOnlineCount() {
    
            WebSocket.onlineCount--;
    
        }
       
    }
    

    客户端:

    <script>
        var websocket = null;
        // 当前登录的用户
        var username = "${map.login}";
        //判断当前浏览器是否支持WebSocket
        if ('WebSocket' in window) {
            websocket = new WebSocket("ws://localhost:8080/websocket/"+username);
        } else {
            alert('当前浏览器 Not support websocket');
        }
    
        websocket.onopen = function(){
    
        };
        //连接发生错误的回调方法
        websocket.onerror = function () {
            alert("WebSocket连接发生错误");
        };
        websocket.onmessage = function (event){
            var message = JSON.parse(event.data);
            alert(message);
        };
    
    </script>
    

    本实例使用CopyOnWriteArrayList存放用户名和session的map值,解决了同一个用户使用不同浏览器登录时,页面接收到消息错乱的问题。

    相关文章

      网友评论

          本文标题:Websocket初探

          本文链接:https://www.haomeiwen.com/subject/tdslgctx.html