WebScoket-服务器客户端双向通信

打印 上一主题 下一主题

主题 868|帖子 868|积分 2604

WebScoket学习笔记

1. 消息推送常用方式先容

轮询
浏览器以指定的时间隔断向服务器发出HTTP请求,服务器实时返回数据给浏览器。

长轮询
浏览器发出ajax请求,服务器端接收到请求后,会阻塞请求直到有数据或者超时才返回。

SSE
server-sent-event:服务器发送事件
SSE是在服务器和客户端之间打开一个单向通道,服务器通向客户端。
服务器响应的不再是一次性的数据包,而是text/event-stream类型的数据流信息。
服务器有数据变更时,将数据流式传输到客户端。

2. WebSocket

2.1 先容

WebSocket是一种在基于TCP连接上进行全双工通信的协议。
说明:

  • 全双工:答应数据在两个方向上同时传输。
  • 半双工:答应数据在两个方向上传输,但是同一个时间段内只答应一个方向上传输。

2.2 客户端API

websocket对象创建
  1. let ws = new WebSocket(URL);
复制代码
URL说明

  • 格式:协议://ip地点:端口/访问路径
  • 协议:协议名称为ws
websocket对象相关事件
事件事件处理程序描述openws.onopen连接建立时messagews.onmessage客户端担当到服务器发送到数据时触发closews.onclose连接关闭时触发errorws.onerror发生错误时触发websocket对象提供的方法
send():通过websocket对象调用该方法发送数据给服务端。
  1. [/code][size=4]2.3 服务端API[/size]
  2. Tomcat的7.0.5版本开始支持websocket,并且实现了Java websocket规范。
  3. Java websocket应用由一系列的Endpoint组成。Endpoint是一个java对象,代表WebSocket链接的一端,对于服务端,我们可以视为处理具体websocket消息的接口。
  4. 我们可以通过两种方式定义Endpoint:
  5. [list]
  6. [*]第一种是编程式,即继承类javax.websocket.Endpoint并实现其方法。
  7. [*]第二种是注解式,即定义一个POJO,并添加@ServerEndpoint相关注解。
  8. [/list]Endpoint实例在WebSocket握手时创建,并在客户端与服务端链接过程中有效,最后在链接关闭时结束。在Endpoint接口中明白定义了与其生命周期相关的方法,规范实现者确保生命周期的各个阶段调用实例的相关方法。生命周期方法如下:
  9. [table][tr]方法描述注解[/tr][tr][td]onOpen()[/td][td]当开启一个新的会话时调用,该方法是客户端与服务器端握手成功后调用的方法[/td][td]@OnOpen[/td][/tr][tr][td]onClose()[/td][td]当会话关闭时调用[/td][td]@OnClose[/td][/tr][tr][td]onError()[/td][td]当连接过程异常时调用[/td][td]@OnError[/td][/tr][/table][b]服务器端担当客户端数据[/b]
  10. [list]
  11. [*]编程式
  12. 通过添加MessageHandler消息处理器来接收消息
  13. [*]注解式
  14. 在定义Endpoint时,通过@OnMessage注解指定接收消息的方法
  15. [/list][b]服务器端推送数据到客户端[/b]
  16. 发送消息则由RemoteEndpoint完成,其实例由Session维护。
  17. 发送消息有2种方式
  18. [list]
  19. [*]通过session.getBasicRemote获取同步消息发送的实例,然后调用其sendXXX()方法发送消息。
  20. [*]通过session.getAsyncRemote获取异步消息发送实例,然后调用其sendXXX()方法发送消息。
  21. [/list][code]@ServerEndpoint("/chat")
  22. @Component
  23. public class ChatEndpoint {
  24.   @OnOpen
  25.   public void onOPen(Session session,EndPointConfig config){
  26.    
  27.   }
  28.   
  29.   @OnMessage
  30.   public void onMessage(String message){
  31.    
  32.   }
  33.   
  34.   @OnClose
  35.   public void onClose(Session session){
  36.    
  37.   }
  38. }
复制代码
3. 总结

新建SpringBoot项目,导入依赖:
  1. <dependency>
  2.   <groupId>org.springframework.boot</groupId>
  3.   <artifactId>spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>org.springframework.boot</groupId>
  7.     <artifactId>spring-boot-starter-websocket</artifactId>
  8. </dependency>
复制代码
编写设置类,扫描全部添加@ServerEndpoint注解的Bean:
  1. @Configuration
  2. public class WebSocketConfig {
  3.     @Bean
  4.     public ServerEndpointExporter serverEndpointExporter() {
  5.         return new ServerEndpointExporter();
  6.     }
  7. }
复制代码
编写设置类,用户获取HttpSession对象
  1. @Configuration
  2. public class GetHttpSessionConfigurator extends ServerEndpointConfig.Configurator {
  3.     @Override
  4.     public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
  5.         HttpSession session = (HttpSession) request.getHttpSession();
  6.         // 将HttpSession对象存储到配置对象中
  7.         sec.getUserProperties().put(HttpSession.class.getName(), session);
  8.     }
  9. }
复制代码
在@ServerEndpoint注解中引入设置器
  1. @ServerEndpoint(value = "/chat",configurator = GetHttpSessionConfigurator.class)
复制代码
创建ChatEndPoint
  1. @Component
  2. @ServerEndpoint(value = "/chat",configurator = GetHttpSessionConfigurator.class)
  3. public class ChatEndpoint {
  4.     private static final Map<String, Session> onlineUsers = new ConcurrentHashMap<>();
  5.     private HttpSession httpSession;
  6.     @OnOpen
  7.     public void onOpen(Session session, EndpointConfig config) {
  8.         this.httpSession = (HttpSession) config.getUserProperties().get(HttpSession.class.getName());
  9.     }
  10.     public void broadcastAllUser(){
  11.     }
  12.     @OnMessage
  13.     public void onMessage(String message, Session session) {
  14.     }
  15.     @OnClose
  16.     public void onClose(Session session, CloseReason closeReason) {
  17.     }
  18. }
复制代码
服务器向客户端发送消息:
  1. session.getAsyncRemote().sendText("...");
复制代码
客户端向服务器发送消息:
  1. let ws = new WebSocket("ws://localhost:8080/chat")
  2. ws.send("xxx");
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表