Websocket初探

2019-12-05  本文已影响0人  禾叶super

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值,解决了同一个用户使用不同浏览器登录时,页面接收到消息错乱的问题。

上一篇下一篇

猜你喜欢

热点阅读