1、在pom.xml引入WebSocket相关
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>
2、编写配置类
package com.yxbuild.config; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer{ @Override public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) { stompEndpointRegistry.addEndpoint("/websocket").withSockJS(); } @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/topic"); } }
3、在启动类添加@EnableWebSocketMessageBroker注解
package com.yxbuild; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; @SpringBootApplication @EnableWebSocketMessageBroker public class WebsocketApplication { public static void main(String[] args) { SpringApplication.run(WebsocketApplication.class, args); } }
4、编写消息属性类
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class MessageResponse { private String responseMessage; private String status; }
5、编写消息管理工具类
import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class WebSocketUtils { // 队列大小 public static final int QUEUE_MAX_SIZE = 10000; private static WebSocketUtils alarmWebSocketUtils = new WebSocketUtils(); // 阻塞队列 private BlockingQueue<Object> blockingQueue = new LinkedBlockingQueue<Object>(QUEUE_MAX_SIZE); private WebSocketUtils(){ } public static WebSocketUtils getInstance() { return alarmWebSocketUtils; } /** * 消息入队 - 队列满了就抛出异常,不阻塞 * * @param message * @return */ public boolean push(Object message) { return this.blockingQueue.add(message); } /** * 消息出队 * * @return */ public Object poll() { Object result = null; try { result = this.blockingQueue.take(); } catch (InterruptedException e) { e.printStackTrace(); } return result; } }
6、编写Controller并且放置消息
@Controller @RequestMapping(value = "/webSocket") public class WebSocketController{ @Autowired private SimpMessagingTemplate messagingTemplate; /** * 放置消息 * */ @RequestMapping(value = "/pushMessage") @ResponseBody public void pushMessage(){ for(int i = 0;i < 10;i++){ MessageResponse messageResponse = new MessageResponse(); messageResponse.setResponseMessage("消息" + i); messageResponse.setStatus("1"); WebSocketUtils.getInstance().push(messageResponse); } } /** * 将消息往页面发送 * */ @PostConstruct public void pushMessage(){ ExecutorService executorService=Executors.newFixedThreadPool(2); Runnable runnable = new Runnable() { @Override public void run() { while (true) { try { MessageResponse messageResponse = (MessageResponse)WebSocketUtils.getInstance().poll(); if(messageResponse != null){ if(messagingTemplate != null) { messagingTemplate.convertAndSend("/topic/pullMessage" ,messageResponse); } } } catch (Exception e) { e.printStackTrace(); } } } }; executorService.submit(runnable); executorService.submit(runnable); } }
7、页面获取消息(需引入sockjs.js和stomp.js)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>WebSocket Logger</title> <script th:src="@{/static/js/sockjs.js}"></script> <script th:src="@{/static/js/stomp.js}"></script> <script th:src="@{/static/js/jquery.min.js}"></script> </head> <body> <button onclick="executeWebSocket()">获取消息</button> </body> <script> /** * 执行 */ function executeWebSocket(){ openSocket();// 开始实时后台检测信息显示 $.ajax({ url:'pushMessage',
type:'post' }); } /** * 开启连接 * */ var stompClient = null; function openSocket() { if(stompClient==null){ var socket = new SockJS('/websocket');// 与配置类的一致 stompClient = Stomp.over(socket); stompClient.connect({token:"kl"}, function(frame) { // /topic/pullMessage与controller类的放置消息路径一致 stompClient.subscribe('/topic/pullMessage', function(event) { var content = JSON.parse(event.body); var message = content.responseMessage; alert(message); },{ token : "kltoen" }); }); } } /** * 断开连接 * */ function closeSocket() { if (stompClient != null) { stompClient.disconnect(); stompClient=null; } } </script> </body> </html>
相关推荐
在本项目中,"springboot+websocket进度条实战"是一个基于Spring Boot框架和WebSocket技术的实战应用,旨在展示如何在Web应用程序中实现一个实时的进度条功能。Spring Boot简化了Java Web开发,提供了快速构建独立...
HttpSessionHandshakeInterceptor:拦截器,可以对Websocket通信过程中的请求进行拦截处理。 除了上述三个官方提供的类/接口之外,我们还需要实现一个WebSocket的包装类,用于为每一个WebSocket实例添加额外的信息,...
- **性能优化**:考虑减少轮询频率或采用更高效的通信方式,比如WebSocket,以减轻服务器负载。 #### 总结 通过上述步骤,我们可以有效地在Java项目中实现进度条功能,显著改善用户在等待长时间任务完成时的体验。...
这通常需要服务器端支持长轮询、WebSocket等技术。 2. **计算预测**:如果任务的执行速度相对稳定,可以在客户端根据已知总工作量和已完成工作量来估算进度。 3. **Worker通信**:在Web Worker中更新进度信息,然后...
WebSocket提供双向通信,可以实现实时更新,而Firebase则提供了强大的实时数据同步和云消息推送功能。 2. **GPS与位置服务**: 首先,需要获取用户的位置信息。Android提供了Location API,通过请求权限,可以访问...
综上所述,实现Java Web的文件上传并展示实时进度,需要结合前后端的技术,包括Spring MVC的文件处理、异步上下文、前端AJAX通信以及前端进度条组件的使用。同时,还要注意安全性与性能优化,以提供稳定且高效的文件...
在IT行业中,构建一个“高仿微信实时语音聊天dialog”是一项常见的需求,特别是在移动应用开发领域。微信作为全球用户量巨大的社交平台,...通过合理地整合这些技术,我们可以创建出一个高效、用户友好的语音聊天功能。
模板可能整合了像jQuery File Upload或Plupload这样的上传组件,支持多文件上传、进度条显示、文件类型检查等功能。 在"ace模板"这个压缩包文件中,你应该能找到所有这些功能的实现代码、CSS样式文件、JavaScript...
4. **网络通信**:对于网络相关的功能,如HTTP请求、WebSocket通信、AMF序列化等,AS3CBLibrary可能会提供封装好的接口,简化网络数据交换。 5. **数据持久化**:AS3CBLibrary可能包括本地存储解决方案,比如XML、...
"窗口控件"是指在WinForm中用于构建用户界面的各种组件,如按钮、文本框、标签、进度条等。这些控件的使用和事件处理是编程的基础,源码可能涵盖如何添加控件、设置属性、响应用户交互等。 "文件操作"涉及文件的...
1. **实时通信**:通过WebSocket或者Socket.io等库,JavaScript可以实现实时双向通信,使得团队成员能即时共享信息、更新项目状态,提高协作效率。 2. **协同编辑**:利用Ace Editor或CodeMirror等代码编辑器库,...
1. **SVN环境搭建**:版本控制系统,用于团队协作中的代码同步。 2. **多属性传递**:可以通过Java的集合类如Map来实现。 3. **数组幂集**:利用递归或位运算生成所有可能的子集组合。 4. **最大子串**:字符串处理...