Real-Time Monitoring System Using WebSocket with Vue Frontend and SpringBoot Backend

This article demonstrates how to build a real-time equipment monitoring solution by using WebSocket for server‑client communication, a Vue.js front‑end to display device status on a map, and a SpringBoot back‑end that broadcasts abnormal alerts to connected browsers.

Architecture Digest
Architecture Digest
Architecture Digest
Real-Time Monitoring System Using WebSocket with Vue Frontend and SpringBoot Backend

The article describes a practical implementation of a fire‑equipment inspection system where abnormal findings are reported via a mobile client and instantly reflected on a real‑time monitoring page using WebSocket communication.

Frontend Implementation

The front‑end is a simple Vue.js page that lists devices and changes their visual state (green for normal, red for abnormal) based on messages received from the server. The HTML and CSS define the layout, while the JavaScript creates a WebSocket connection, handles incoming messages, and updates the Vue data model.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title>实时监控</title>
    </head>
    <style>
        .item {display: flex; border-bottom: 1px solid #000; justify-content: space-between; width: 30%; line-height: 50px; height: 50px;}
        .item span:nth-child(2){margin-right:10px; margin-top:15px; width:20px; height:20px; border-radius:50%; background:#55ff00;}
        .nowI{background:#ff0000 !important;}
    </style>
    <body>
        <div id="app">
            <div v-for="item in list" class="item">
                <span>{{item.id}}.{{item.name}}</span>
                <span :class='item.state==-1?"nowI":""'></span>
            </div>
        </div>
    </body>
    <script src="./js/vue.min.js"></script>
    <script type="text/javascript">
        var vm = new Vue({
            el: "#app",
            data: {list: [{id:1,name:'张三',state:1},{id:2,name:'李四',state:1},{id:3,name:'王五',state:1},{id:4,name:'韩梅梅',state:1},{id:5,name:'李磊',state:1}]}
        });
        var webSocket = null;
        if ('WebSocket' in window) {
            webSocket = new WebSocket("ws://localhost:18801/webSocket/" + getUUID());
            webSocket.onopen = function(){ console.log("已连接"); webSocket.send("消息发送测试"); };
            webSocket.onmessage = function(msg){
                var serverMsg = msg.data;
                var t_id = parseInt(serverMsg);
                for (var i=0; i<vm.list.length; i++) {
                    var item = vm.list[i];
                    if(item.id == t_id){
                        item.state = -1;
                        vm.list.splice(i,1,item);
                        break;
                    }
                }
            };
            webSocket.onclose = function(){ console.log("websocket已关闭"); };
            webSocket.onerror = function(){ console.log("websocket发生了错误"); };
        } else { alert("很遗憾,您的浏览器不支持WebSocket!"); }
        function getUUID(){
            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c){
                var r = Math.random()*16|0, v = c=='x'?r:(r&0x3|0x8);
                return v.toString(16);
            });
        }
    </script>
</html>

Backend Implementation

The back‑end is a SpringBoot application that includes WebSocket dependencies, an application.yml configuration for the server port and a simple password, a WebSocket configuration class to enable endpoint registration, and a server endpoint that manages connections, broadcasts messages, and logs events.

# application.yml
server:
  port: 18801
mySocket:
  myPwd: jae_123
@Configuration
public class WebSocketConfig {
    @Bean
    public ServerEndpointExporter serverEndpointExporter(){
        return new ServerEndpointExporter();
    }
}
@ServerEndpoint("/webSocket/{uid}")
@Component
public class WebSocketServer {
    private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);
    private static final AtomicInteger onlineNum = new AtomicInteger(0);
    private static CopyOnWriteArraySet<Session> sessionPools = new CopyOnWriteArraySet<>();
    @OnOpen
    public void onOpen(Session session, @PathParam("uid") String uid){
        sessionPools.add(session);
        onlineNum.incrementAndGet();
        log.info(uid + "加入webSocket!当前人数为" + onlineNum);
    }
    @OnClose
    public void onClose(Session session){
        sessionPools.remove(session);
        int cnt = onlineNum.decrementAndGet();
        log.info("有连接关闭,当前连接数为:{}", cnt);
    }
    public void sendMessage(Session session, String message) throws IOException {
        if(session != null){
            synchronized (session){
                session.getBasicRemote().sendText(message);
            }
        }
    }
    public void broadCastInfo(String message) throws IOException {
        for(Session session : sessionPools){
            if(session.isOpen()){
                sendMessage(session, message);
            }
        }
    }
    @OnError
    public void onError(Session session, Throwable throwable){
        log.error("发生错误");
        throwable.printStackTrace();
    }
}
@RestController
@RequestMapping("/open/socket")
public class WebSocketController {
    @Value("${mySocket.myPwd}")
    public String myPwd;
    @Autowired
    private WebSocketServer webSocketServer;
    @PostMapping(value = "/onReceive")
    public void onReceive(String id, String pwd) throws IOException {
        if(pwd.equals(myPwd)){
            webSocketServer.broadCastInfo(id);
        }
    }
}

Testing Procedure

1. Open the front‑end page; the console shows a successful WebSocket connection. 2. Initially all devices appear normal (green). 3. Use Postman to POST to /open/socket/onReceive with the device ID (e.g., 3) and the password; the server broadcasts the ID, the front‑end receives it, and the corresponding device turns red, confirming real‑time communication.

Reference

WebSocket documentation: MDN WebSocket API

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

BackendReal-TimeWebSocketVue.jsSpringBoot
Architecture Digest
Written by

Architecture Digest

Focusing on Java backend development, covering application architecture from top-tier internet companies (high availability, high performance, high stability), big data, machine learning, Java architecture, and other popular fields.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.