Java后端WebSocket的实现

这篇具有很好参考价值的文章主要介绍了Java后端WebSocket的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WebSocket
1.什么是WebSocket?

webSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。

webSocket使得客户端和服务器之间的数据交换变得更加简单,(在线聊天基础)允许服务端主动向客户端推送数据(服务器可以主动发消息给客户端)。在webSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
Java后端WebSocket的实现

其他特点

  • 较少的控制开销
  • 更强的实时性
  • 保持连接状态
  • 更好的二进制支持
  • 可以支持扩展
  • 更好的压缩效果
2.为什么需要WebSocket?

举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP协议做不到服务器主动向客户端推送信息。

现在,很多网站为了实现推送技术,所用的技术都是Ajax轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

而比较新的技术去做轮询的效果是comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源。

HTML5定义的WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

3.WebSocket实现聊天功能(后端)

Note:WebSocket在前端实现较为复杂,在后端只是起一个中转消息的功能!

  1. 引入依赖
<!--        WebSocket实现聊天功能-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
  1. 编写WebSocket配置类
/**
 * WebSocket配置类
 *
 * @author liu xiang zheng
 * @data 4.18 20:57
 **/
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Value("${jwt.tokenHead}")
    private String tokenHead;

    @Autowired
    private JwtTokenUtil jwtTokenUtil;

    @Autowired
    private UserDetailsService userDetailsService;

    /**
     * 让前端连接后端的websocket服务
     * 添加这个Endpoint,这样在网页可以通过websocket连接上服务
     * 也就是我们配置websocket的服务地址,并且可以指定是否使用socketJS
     * 前端使用socketJS去连接后端的服务
     * @param registry
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        /**
         * 1.将ws/ep路径注册未stomp的端点,用户连接了这个端点就可以进行websocket通讯,支持socketJS
         * 2.setAllowedOrigins("*"):允许你跨域  .*表示所有的链接都允许
         * 3.withSocketJS():支持socketJS访问
         */
        registry.addEndpoint("/ws/ep").setAllowedOrigins("*").withSockJS();
    }

    /**
     * 正常情况下(未使用JWT令牌)我们是不需要配置的,但是此项目中使用了JWT令牌
     * 获取JWT令牌同时做相应的处理
     * 输入通道参数配置
     *
     * @param registration
     */
    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
        registration.interceptors(new ChannelInterceptor() {
            /**
             * 预发送
             * @param message
             * @param channel
             * @return
             */
            @Override
            public Message<?> preSend(Message<?> message, MessageChannel channel) {
                /**
                 * StompHeaderAccessor的目的:用户判断是不是链接
                 * 是链接则获取到对应的token同时设置到相应的用户里面去
                 */
                StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
                // 判断是否是连接,如果是,需要获取token,并且设置用户对象
                if(StompCommand.CONNECT.equals(accessor.getCommand())){
                    // Auth-Token 不是随便写的参数  是前端传递给我们的参数
                    String token = accessor.getFirstNativeHeader("Auth-Token");
                    /*
                    不为空做相应的截取
                     */
                    if(!StringUtils.isEmpty(token)){
                        String authToken = token.substring(tokenHead.length());
                        // 拿到用户名
                        String username = jwtTokenUtil.getUserNameFromToken(authToken);
                        // token中存在用户名 则可以进行相应的登录
                        if(!StringUtils.isEmpty(username)){
                            // 登录
                            UserDetails userDetails = userDetailsService.loadUserByUsername(username);
                            // 验证token是否有效,重新设置用户对象
                            if(jwtTokenUtil.validateToken(authToken,userDetails)){
                                UsernamePasswordAuthenticationToken authenticationToken =
                                        new UsernamePasswordAuthenticationToken(userDetails, null,
                                                userDetails.getAuthorities());
                                SecurityContextHolder.getContext().setAuthentication(authenticationToken);
                                accessor.setUser(authenticationToken);
                            }
                        }
                    }
                }
                return message;
            }
        });
    }

    /**
     * 配置消息代理
     * @param registry
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        /**
         * 配置代理域,可以配置多个,配置代理的目的地前缀为/queue,可以在配置域上客户端推送消息
         */
        registry.enableSimpleBroker("queue");
    }
}

配置类完成以后,去写对应的接口类,让客户端调用我们的方法。文章来源地址https://www.toymoban.com/news/detail-458893.html

  1. 消息实体类编写
/**
 * 消息
 *
 * @author liu xiang zheng
 * @data 4.19 10:48
 **/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain  = true)
public class ChatMsg {

    // 哪个人发的消息
    private String from;
    // 发到哪里去
    private String to;
    // 内容
    private String content;
    // 时间
    private LocalDateTime date;
    // 发送消息的昵称
    private String formNickName;
}
  1. Controller接口编写
/**
 * websocket
 *
 * @author liu xiang zheng
 * @data 4.19 10:53
 **/
@Controller
public class WsController {

    @Autowired
    private SimpMessagingTemplate simpMessagingTemplate;

    @MessageMapping("/ws/chat")
    public void handleMsg(Authentication authentication, ChatMsg chatMsg){
        /**
         * 获取当前用户对象
         */
        Admin admin = (Admin)authentication.getPrincipal();
        chatMsg.setFrom(admin.getUsername());
        chatMsg.setFormNickName(admin.getName());
        chatMsg.setDate(LocalDateTime.now());
        /**
         * 此处的 /queue/chat 是我们最开始在配置类里面配置的
         * 它也就会通过queue转到配置类里面去
         */
        simpMessagingTemplate.convertAndSendToUser(chatMsg.getTo(),"/queue/chat",chatMsg);

    }
}
  1. Security配置类中放行
  "/ws/**"

到了这里,关于Java后端WebSocket的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HTML5 WebSocket介绍与基本使用(解析服务端返回的二进制数据)

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行

    2024年02月15日
    浏览(40)
  • 什么是 WebSocket?Java 中如何实现 WebSocket?

    WebSocket 是一种新型的网络协议,它允许客户端和服务器之间进行双向通信,可以实现实时数据交互。WebSocket 协议是基于 HTTP 协议的,使用标准的 TCP 连接,可以在客户端和服务器之间建立一条持久化的连接,而不需要像 HTTP 协议那样每次请求都需要重新建立连接。 WebSocket 协

    2024年02月16日
    浏览(49)
  • java后端使用websocket实现与客户端之间接收及发送消息

    客户端请求websocket接口,连接通道=》我这边业务成功客户端发消息=》客户端自动刷新。 接口:ws://localhost:8080/websocket/xx 经测试,成功 如果是线上服务器连接,则需要在nginx里配置websocket相关内容,再重启nginx,代码如下 本地连接的时候用的是ws://,因为是http链接,但是如果是

    2024年02月16日
    浏览(46)
  • 服务端(后端)主动通知前端的实现:WebSocket(springboot中使用WebSocket案例)

    我们都知道 http 协议只能浏览器单方面向服务器发起请求获得响应,服务器不能主动向浏览器推送消息。想要实现浏览器的主动推送有两种主流实现方式: 轮询:缺点很多,但是实现简单 websocket:在浏览器和服务器之间建立 tcp 连接,实现全双工通信 springboot 使用 websocket 有

    2023年04月14日
    浏览(68)
  • WebSocket实现后端数据变化,通知前端实时更新数据

    背景 ​ 项目中需要做一个消息提示功能,当有用户处理相关待办信息后,别的用户需要实时更新处理后的待办信息。 解决方案: ​ 1、使用最原始的方法,写个定时器去查询待办信息。但这种方式在大多数情况是不被允许的,它会浪费系统中的许多资源,同时也并不是完全

    2024年04月15日
    浏览(49)
  • Vue使用WebSocket实现实时获取后端推送的数据。

    Vue可以使用WebSocket实现实时获取后端推送的数据。 1.在Vue项目中安装WebSocket库 可以使用npm或yarn安装WebSocket库: 2.创建WebSocket连接 在Vue组件中创建WebSocket连接,连接到后端WebSocket服务器,代码如下: 上面的代码中,使用WebSocket连接到后端WebSocket服务器,通过监听onmessage事件,

    2024年02月08日
    浏览(50)
  • 基于WebSocket双向通信技术实现-下单提醒和催单(后端)

    学习复盘和总结项目亮点。 扩展 :该功能能应用在,各种服务类项目中。(例如:酒店、洗脚城等系ERP系中提醒类服务) 4.1 需求分析和设计 用户下单并且支付成功后,需要第一时间通知外卖商家。通知的形式有如下两种: 语音播报 弹出提示框 设计实现思路: 通过WebSoc

    2024年01月18日
    浏览(70)
  • websocket 实现后端主动前端推送数据、及时通讯(vue3 + springboot)

    WebSocket 是一种全双工通信协议,用于在 Web 浏览器和服务器之间建立持久的连接。 WebSocket 协议由 IETF 定为标准,WebSocket API 由 W3C 定为标准。 一旦 Web 客户端与服务器建立连接,之后的全部数据通信都通过这个连接进行。 可以互相发送 JSON、XML、HTML 或图片等任意格式的数据

    2024年03月17日
    浏览(52)
  • Thinkphp5.0 安装使用Workerman实现websocket前后端通信,后端主动推送消息到前端

    安装使用Workerman实现websocket前后端通信,后端主动推送消息到前端,实现后端有数据更新时,前端页面自动更新数据。 我使用的是基于Thinkphp5.0的ThinkCMF5.0。 安装: 启动: public目录下放置的server.php文件,注意里面的配置必须按照你的Worker控制器来: woker控制器: 后端主动推

    2024年02月16日
    浏览(55)
  • WebSocket 是什么原理?为什么可以实现持久连接?

    WebSocket 是一种用于实现持久连接的通信协议,它的原理和工作方式相对复杂,但我们可以尝试以尽可能简单和清晰的方式来解释它。 WebSocket 的原理 在理解 WebSocket 的工作原理之前,我们首先要了解 HTTP 协议的短连接性质。在传统的 HTTP 通信中,客户端发送一个请求到服务器

    2024年02月05日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包