WebSocket的实现原理

Posted Kelly-Li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebSocket的实现原理相关的知识,希望对你有一定的参考价值。

1、客户端(浏览器)实现

(1)webSocket对象

实现WebSocket对象的web浏览器通过WebSocket对象公开所有必需的客户端功能。
创建WebSocket对象

var ws = new WebSocket(url);
//url格式:ws://ip地址:端口号/资源名称

(2)webSocket事件

webSocket相关的事件,浏览器与服务器建立连接、如何接收服务器消息、如何向服务器发送消息(这个使用的是webSocket对象中的方法)等事件描述。

事件事件处理程序描述
openwebSocket对象.onopen连接建立时触发
messagewebSocket对象.onmessage客户端接收服务端数据时触发
errorwebSocket对象.onerror通信发生错误时触发
closewebSocket对象.onclose连接关闭时触发

(3)webSocket方法

方法描述
send()客户端向服务器端发送数据时的方法

2、服务器端的实现

前提:Tomcat 7.0.5版本后才开始支持WebSocket。
Java WebSocket应用由一系列的WebSocketEndpoint组成。

(1) Endpoint对象

Endpoint是Java中的一个对象,代表WebSocket链接的一端(每一个客户端需要创建一个Endpoint对象)
对于服务器端,Endpoint对象可以看作是处理WebSocket消息的接口。===类似Servlet与HTTP请求中的Servlet

(2)Endpoint对象的定义

两种方式定义Endpoint对象。

  • 编程式,通过代码编程,继承类Javax.websocket.Endpoint并实现其方法;
  • 注解式,通过定义一个POJO类,并使用**@ServerEndpoint**相关注解。

Endpoint对象实例在WebSocket握手时创建,并在客户端与服务端链接过程中有效,最后在链接关闭时结束。
在Endpoint接口中明确定义了与生命周期相关的方法。

方法含义描述对应注解
onClose()当会话关闭时调用@Onclose
onOpen()当开启一个新的会话时调用,该方法是客户端与服务端握手成功后调用的方法@OnOpen
onError()当连接过程中异常时调用@OnError

(3)服务端如何接收客户端发送的数据?

通过为Session添加MessageHandler消息处理器来接收消息。
当采用注解方式定义Endpoint时,可以使用**@OnMessage**注解指定接收消息的方法。

(4)服务器端如何推送数据给客户端?

服务器向客户端发送消息由RemoteEndpoint完成,其实例Session维护,根据使用情况,可以通过Session.getBasicRemote获取同步消息发送的实例,然后调用sendXxx()方法就可以发送消息。可以通过Session.getAsyncRemote获取异步消息发送实例。

简易聊天室服务端代码实例:

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

@ServerEndpoint("\\robin")
public class chatEndPoint {
   private static Set<chatEndPoint> webSocketSet = new HashSet<chatEndPoint>();
   private Session session;

   /**
    * 接收到客户端发送过来的消息时,该方法自动调用。
    * @param message 接收到的客户端发送过来的消息。
    * @param session
    * @throws IOException
    */
   @OnMessage
   public void onMessage(String message,Session session) throws IOException {
       System.out.println("接收的消息是:"+message);
       System.out.println(session);

       //将消息发送给其他的用户
       for(chatEndPoint chat:webSocketSet){
           if (chat != this){
               chat.session.getBasicRemote().sendText(message);
           }
       }
   }

   /**
    * 建立连接时,自动调用
    * @param session
    */
   @OnOpen
   public  void  onOpen(Session session){
       this.session = session;
       webSocketSet.add(this);
   }

   /**
    * 建立关闭时,自动调用
    * @param session
    */
   @OnClose
   public  void  onClose(Session session){
       System.out.println("连接关闭了....");
   }

   /**
    * 建立出错时,自动调用
    * @param session
    */
   @OnError
   public  void  onError(Session session,Throwable error){
       System.out.println("出错了...."+error.getMessage());
   }

}

以上是关于WebSocket的实现原理的主要内容,如果未能解决你的问题,请参考以下文章

WebSocket的实现原理

websocket实现原理

websocket实现原理

WebSocket的实现原理

websocket原理为何能实现持久连接?

springboot - websocket实现及原理