hpsocket websocket服务端连接主动关闭_SpringBoot 集成 WebSocket 实现前后端消息互传...

WebSocket 协议是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工 (full-duplex) 通信—允许服务器主动发送信息给客户端。

b1e01173e194a132f9bb7038fdd2eabd.png

为什么需要WebSocket?

大家都知道以前客户端想知道服务端的处理进度,要不停地使用 Ajax 进行轮询,让浏览器隔个几秒就向服务器发一次请求,这对服务器压力较大。另外一种轮询就是采用 long poll 的方式,这就跟打电话差不多,没收到消息就一直不挂电话,也就是说,客户端发起连接后,如果没消息,就一直不返回 response 给客户端,连接阶段一直是阻塞的。

而 WebSocket 解决了 HTTP 的这几个难题。当服务器完成协议升级后( HTTP -> WebSocket ),服务端可以主动推送信息给客户端,解决了轮询造成的同步延迟问题。由于 WebSocket 只需要一次 HTTP 握手,服务端就能一直与客户端保持通信,直到关闭连接,这样就解决了服务器需要反复解析 HTTP 协议,减少了资源的开销。

3e4df2d0b8b40201c13e0585d9f4b01e.png

现在通过 SpringBoot 集成 WebSocket 来实现前后端通信。

集成 WebSocket 实现前后端通信

项目代码结构图

a14a99b2e492c4e804e79150b14c0ede.png

依赖导入

SpringBoot2.0 对 WebSocket 的支持简直太棒了,直接就有包可以引入 。

org.springframework.boot spring-boot-starter-websocket 

配置 WebSocketConfig

启用WebSocket的支持也是很简单,将ServerEndpointExporter对象注入到容器中。

package com.tuhu.websocketsample.configuration;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configurationpublic class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }}

WebSocket 服务端 WebSocketServer

因为 WebSocket 是类似客户端服务端的形式(采用ws协议),那么这里的 WebSocketServer 其实就相当于一个 ws协议的 Controller。直接 @ServerEndpoint("/websocket") 、@Component 启用即可,然后在里面实现@OnOpen , @onClose ,@onMessage等方法

package com.tuhu.websocketsample.controller;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import javax.websocket.*;import javax.websocket.server.PathParam;import javax.websocket.server.ServerEndpoint;import java.io.IOException;import java.util.concurrent.CopyOnWriteArraySet;@Component@ServerEndpoint("/websocket/{sid}")@Slf4jpublic class WebSocketServer { /** * 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。 */ private static int onlineCount = 0; /** * concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。 */ private static CopyOnWriteArraySet webSocketSet = new CopyOnWriteArraySet<>(); /** * 与某个客户端的连接会话,需要通过它来给客户端发送数据 */ private Session session; /** * 接收sid */ private String sid=""; /** * 连接建立成功调用的方法 **/ @OnOpen public void onOpen(Session session,@PathParam("sid") String sid) { this.session = session; //加入set中 webSocketSet.add(this); //在线数加1 addOnlineCount(); log.info("有新窗口开始监听:"+sid+
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值