初识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(关闭连接时的响应事件)

 

   

 

posted on 2018-04-19 22:26  Herrt灬凌夜  阅读(353)  评论(0编辑  收藏  举报

导航