WebSocket的实现原理

WebSocket的实现原理,第1张

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()当会话关闭时调用@OncloseonOpen()当开启一个新的会话时调用,该方法是客户端与服务端握手成功后调用的方法@OnOpenonError()当连接过程中异常时调用@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 webSocketSet = new HashSet();
   private Session session;

   
   @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);
           }
       }
   }

   
   @onOpen
   public  void  onOpen(Session session){
       this.session = session;
       webSocketSet.add(this);
   }

   
   @onClose
   public  void  onClose(Session session){
       System.out.println("连接关闭了....");
   }

   
   @onError
   public  void  onError(Session session,Throwable error){
       System.out.println("出错了...."+error.getMessage());
   }

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4968508.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存