`
Aclik
  • 浏览: 15871 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

整合WebSocket,前后端通信(可用于实现进度条功能)

 
阅读更多

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进度条实战

    在本项目中,"springboot+websocket进度条实战"是一个基于Spring Boot框架和WebSocket技术的实战应用,旨在展示如何在Web应用程序中实现一个实时的进度条功能。Spring Boot简化了Java Web开发,提供了快速构建独立...

    基于springboot实现websocket客户端和服务端

    HttpSessionHandshakeInterceptor:拦截器,可以对Websocket通信过程中的请求进行拦截处理。 除了上述三个官方提供的类/接口之外,我们还需要实现一个WebSocket的包装类,用于为每一个WebSocket实例添加额外的信息,...

    java 进度条

    - **性能优化**:考虑减少轮询频率或采用更高效的通信方式,比如WebSocket,以减轻服务器负载。 #### 总结 通过上述步骤,我们可以有效地在Java项目中实现进度条功能,显著改善用户在等待长时间任务完成时的体验。...

    ajax 多线程时间 进度条

    这通常需要服务器端支持长轮询、WebSocket等技术。 2. **计算预测**:如果任务的执行速度相对稳定,可以在客户端根据已知总工作量和已完成工作量来估算进度。 3. **Worker通信**:在Web Worker中更新进度信息,然后...

    Android 高仿微信雷达搜索好友

    WebSocket提供双向通信,可以实现实时更新,而Firebase则提供了强大的实时数据同步和云消息推送功能。 2. **GPS与位置服务**: 首先,需要获取用户的位置信息。Android提供了Location API,通过请求权限,可以访问...

    java 上传文件,实时获取上传进度.

    综上所述,实现Java Web的文件上传并展示实时进度,需要结合前后端的技术,包括Spring MVC的文件处理、异步上下文、前端AJAX通信以及前端进度条组件的使用。同时,还要注意安全性与性能优化,以提供稳定且高效的文件...

    高仿微信实时语音聊天dialog

    在IT行业中,构建一个“高仿微信实时语音聊天dialog”是一项常见的需求,特别是在移动应用开发领域。微信作为全球用户量巨大的社交平台,...通过合理地整合这些技术,我们可以创建出一个高效、用户友好的语音聊天功能。

    非常漂流后台模版

    模板可能整合了像jQuery File Upload或Plupload这样的上传组件,支持多文件上传、进度条显示、文件类型检查等功能。 在"ace模板"这个压缩包文件中,你应该能找到所有这些功能的实现代码、CSS样式文件、JavaScript...

    上传AS3CBLibrary库

    4. **网络通信**:对于网络相关的功能,如HTTP请求、WebSocket通信、AMF序列化等,AS3CBLibrary可能会提供封装好的接口,简化网络数据交换。 5. **数据持久化**:AS3CBLibrary可能包括本地存储解决方案,比如XML、...

    C#源码参考 winform练习源码大全208个例子打包下载

    "窗口控件"是指在WinForm中用于构建用户界面的各种组件,如按钮、文本框、标签、进度条等。这些控件的使用和事件处理是编程的基础,源码可能涵盖如何添加控件、设置属性、响应用户交互等。 "文件操作"涉及文件的...

    Coworker

    1. **实时通信**:通过WebSocket或者Socket.io等库,JavaScript可以实现实时双向通信,使得团队成员能即时共享信息、更新项目状态,提高协作效率。 2. **协同编辑**:利用Ace Editor或CodeMirror等代码编辑器库,...

    java技术点

    1. **SVN环境搭建**:版本控制系统,用于团队协作中的代码同步。 2. **多属性传递**:可以通过Java的集合类如Map来实现。 3. **数组幂集**:利用递归或位运算生成所有可能的子集组合。 4. **最大子串**:字符串处理...

Global site tag (gtag.js) - Google Analytics