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

相关文章

  • 2020-04-03

    ## webSocket初探 ## 目录 - 为什么WebSocket - 什么是WebSocket - WebS...

  • websocket初探

    Websocket 是什么? WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(...

  • websocket初探

    今天是想分享一下关于websocket在nodejs里面的相关实践。 websocket相关的知识大家在搜索引擎上...

  • Websocket初探

    Websocket是一种在单个TCP连接上进行全双工通信的网络协议,是HTML5新增的协议。那么为何要使用Webs...

  • webSocket初探

    一、WebSocket介绍与原理 WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与...

  • 初探和实现websocket心跳重连

    初探和实现websocket心跳重连 心跳重连缘由 在使用websocket过程中,可能会出现网络断开的情况,比如...

  • WebSocket 初探(一)

    WebSocket WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通...

  • WebSocket 协议初探

    前言 公司项目使用WebSocket作为主要的请求方式,知其然也要知其所以然,会用也需要知道它的基本原理,所以写此...

  • websocket初探学习分享

    本文主要是使用的心得,参考的网址是websocket,本例中使用的是Websocket-Node 服务器模式,本地...

  • WebSocket使用初探(Tornado+Nginx)

    使用场景 在web开发中有时候需要实时获取数据,可以采用的方法也很多,比如ajax轮询,长连接等。之前项目中有一个...

网友评论

      本文标题:Websocket初探

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