后端通知实现方式

设计模式和HTTP的区别

HTTP是基于Client/Server模式的,CS模式下的后端所以操作均时被动的和同步的,这也是基于HTTP请求是无法实现真正的后端主动通知前端的原因所在。
所以要真正思路主动通知,则需要放弃CS模式,实现真正的全双工通信。此时是事件驱动的异步通信。

轮询的实现方式

AJAX轮询(Long poll)本质上仍然是基于CS模式的,后端仍然无法主动通知前端,实现基本思路就是前端(client)定时发送HTTP请求询问后端有无消息。
在这里插入图片描述

Websocket

WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。WebSocket是类似Socket的TCP长连接通讯模式。一旦WebSocket连接建立后,后续数据都以帧序列的形式传输。在客户端断开WebSocket连接或Server端中断连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

WebSocket HANDSHAKING /path/1 [192.168.56.1:60398]# 握手
WebSocket CONNECT /path/1 [192.168.56.1:60398]# 建立连接
WebSocket DISCONNECT /path/1 [192.168.56.1:60398]# 断开

Js websocket api

var ws = new WebSocket("ws://localhost:8080"); 
//申请一个WebSocket对象,参数是服务端地址,同http协议使用http://开头一样,WebSocket协议的url使用ws://开头,另外安全的WebSocket协议使用wss://开头
ws.onopen = function(){
   
  //当WebSocket创建成功时,触发onopen事件
   console.log("open");
  ws.send("hello")
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java实现消息通知后端代码可以基于消息队列和推送服务等方式实现。下面是一个基于RabbitMQ消息队列的Java后端代码示例,实现了向指定用户发送站内信通知的功能: 1. 添加依赖 ```xml <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.7.2</version> </dependency> ``` 2. 配置RabbitMQ连接信息 ```java @Configuration public class RabbitMQConfig { @Bean public ConnectionFactory connectionFactory() { CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost"); connectionFactory.setUsername("guest"); connectionFactory.setPassword("guest"); connectionFactory.setVirtualHost("/"); connectionFactory.setPublisherConfirms(true); return connectionFactory; } @Bean public RabbitTemplate rabbitTemplate() { return new RabbitTemplate(connectionFactory()); } @Bean public DirectExchange directExchange() { return new DirectExchange("directExchange"); } @Bean public Queue queue() { return new Queue("messageQueue"); } @Bean public Binding binding() { return BindingBuilder.bind(queue()).to(directExchange()).with("messageRoutingKey"); } } ``` 3. 发送消息 ```java @RestController @RequestMapping("/message") public class MessageController { @Autowired private RabbitTemplate rabbitTemplate; @PostMapping("/send") public String sendMessage(@RequestBody MessageDto messageDto) { String userId = messageDto.getUserId(); String content = messageDto.getContent(); rabbitTemplate.convertAndSend("directExchange", "messageRoutingKey", new Message(userId, content)); return "success"; } } public class Message { private String userId; private String content; public Message(String userId, String content) { this.userId = userId; this.content = content; } // getters and setters } public class MessageDto { private String userId; private String content; // getters and setters } ``` 4. 接收消息并处理 ```java @Component public class MessageReceiver { @RabbitListener(queues = "messageQueue") public void handleMessage(Message message) { String userId = message.getUserId(); String content = message.getContent(); // 根据userId获取用户信息,向用户发送站内信通知 } } ``` 以上仅是一个简单的示例,具体的实现方式需要根据具体的业务需求来确定。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值