• 初识WebSocket


      之前学习的web端的通信都走的时http协议,都是一次请求一次响应的模式。本文来学习一下webSocket长连接。

      传统的web请求和响应模式中,我们在浏览器中通过http仅仅能实现单向的通信,comet可以一定程度上模拟双向通信,但是效率较低,并且需要服务器有较好的支持;flash中的socket和xmlsocket可以实现真正的双向通信,通过flex ajax bridge,可以在浏览器中得到实现,将会替代上面两项技术,得到广泛的使用,面对这种情况,HTML5定义了websocket协议,能更好的节省服务器资源和带宽并达到实时通讯。

      webSocket目标:打破传统的web请求响应模型,实时管道式的实时通信。打开浏览器和服务器的通信管道,持续连接!服务器给浏览器推送数据,非常方便。

    一、ServerApplicationconfig接口

      项目启动时会自动启动,类似与ContextListener时webSocket的核心配置类。

      他有两个方法:

        1. getEndPointConfigs获取所有以接口方式配置的webSocket类。

        2. getAnnotatedEndpointClasses扫描src下所有类@ServerEndPoint注解类。(EndPoint就指的是一个webSocket的一个服务端程序)

    二、第一个demo

      将tomat的 lib下的2个关联jar包拿到项目下面。

     1 public class DemoConfig implements ServerApplicationConfig{
     2 
     3     //注解方式 启动
     4     public Set<Class<?>> getAnnotatedEndpointClasses(Set<Class<?>> scaned) {
     5         // TODO Auto-generated method stub
     6         System.out.println("启动。。。。。。。。。。。。。。。。。。。。。。");
     7         return null;
     8     }
     9 
    10     //接口方式的启动
    11     public Set<ServerEndpointConfig> getEndpointConfigs(
    12             Set<Class<? extends Endpoint>> arg0) {
    13         // TODO Auto-generated method stub
    14         return null;
    15     }
    16 
    17 }

      上面类继承了ServerApplicationConfig接口,而我们要使用注解,所以只关心getAnnotatedEndpointClasses方法即可。

      而我们创建的连接类只需要加上@ServerEndpoint(value = "")注解,并配上访问路径即可。

    1 @ServerEndpoint(value = "/echo")
    2 public class EchoSocket {
    3 
    4 }

    三、实现一个WebSocket应用程序,我们要学会几个基本操作

      1. 开启连接

      客户端代码:

     1         var ws;//一个ws对象就是一个管道
     2         var target = "ws://localhost:8080/webSocket_01/echo";
     3         function subOpen(){
     4             if("WebSocket" in window){
     5                 ws = new WebSocket(target);
     6             } else if ("MozWebSocket" in window){
     7                 ws = new MozWebSocket(target);
     8             } else {
     9                 alert("WebSocket is not supported by this browser");
    10             }
    11         }

      服务端在EchoSocket类中只要加入@onOpen方法即可

    1 /**
    2      * 一个session代表一个通信会话,一个sessionid代表一个会话
    3      * @param session
    4      */
    5     @OnOpen
    6     public void open(Session session) {
    7         //不同的用户会产生不同的sessionid
    8         System.out.println("id"+session.getId());
    9     }

      2.客户端给服务器发送数据

      ws是全局变量,可以直接使用。

    1     /**
    2         * 客户端发送消息
    3         */
    4         function subSend(){
    5             var msg = $("msg").value;
    6             ws.send(msg);
    7         }

      3. 服务端接收数据

    1     /**
    2      * 服务端获取消息
    3      * @param session
    4      */
    5     @OnMessage
    6     public void message(Session session, String msg, boolean last) {
    7         
    8     }

      4.服务端给客户端发送数据

    1     //服务器返回消息
    2         try {
    3             session.getBasicRemote().sendText("");
    4         } catch (IOException e) {
    5             e.printStackTrace();
    6         }

      5.客户端接受数据

    1             //在subOpen方法中绑定方法
    2             ws.onmessage = function (event){
    3                 console.log(data);
    4             }            

      6. 关闭连接

        当浏览器关闭时只要在方法上加入@OnClose即可

    1 //当浏览器关闭时执行
    2     @OnClose
    3     public void close() {
    4         
    5     }

      监听三类基本事件:onopen(打开连接时的响应事件),onmessage(发送数据时响应事件),onclose(关闭连接时的响应事件)

       

  • 相关阅读:
    Rose 公司系统高可用性解决方案比较
    时序数据库有哪些特点? TimescaleDB时序数据库介绍
    EterneMirrorHA简介
    SpringBoot无法访问接口,报错:This application has no explicit mapping for /error, so you are seeing this as a fallback.
    druid对数据库密码进行加密解密
    Intellij Idea新建 SpringBoot 项目
    IDEA启动项目报错:Caused by: java.io.FileNotFoundException: class path resource [.properties] cannot be opened because it does not exist
    Dubbo添加过滤器(二)日志打印接口耗时
    SpringBoot2.X整合集成Dubbo
    shell 脚本执行带参数的hivesql
  • 原文地址:https://www.cnblogs.com/wuyx/p/8886645.html
Copyright © 2020-2023  润新知