jsp 语言 JSP 与 WebSocket 实现实时智能家居控制示例

JSP阿木 发布于 2025-06-26 11 次阅读


JSP 与 WebSocket 实现实时智能家居控制示例

随着物联网(IoT)技术的快速发展,智能家居系统逐渐成为人们日常生活的一部分。JSP(JavaServer Pages)作为一种流行的服务器端技术,可以用来构建动态的网页。WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它使得服务器和客户端之间可以实时通信。本文将结合 JSP 和 WebSocket 技术实现一个实时智能家居控制示例。

系统概述

本示例系统将实现以下功能:

1. 用户可以通过网页实时查看家居设备的运行状态。

2. 用户可以远程控制家居设备,如开关灯、调节温度等。

3. 系统支持实时数据推送,用户可以实时接收设备状态更新。

技术选型

1. JSP:用于构建动态网页和服务器端逻辑。

2. Servlet:用于处理客户端请求和响应。

3. WebSocket:用于实现客户端与服务器之间的实时通信。

4. MySQL:用于存储设备信息和用户数据。

系统设计

1. 数据库设计

我们需要设计数据库来存储设备信息和用户数据。以下是数据库的简单设计:

- 用户表(users):存储用户信息,如用户名、密码等。

- 设备表(devices):存储设备信息,如设备名称、类型、状态等。

2. JSP 页面设计

接下来,我们需要设计 JSP 页面来展示设备信息和控制界面。

- index.jsp:主页面,展示设备列表和实时状态。

- control.jsp:控制页面,提供设备控制功能。

3. Servlet 设计

Servlet 用于处理客户端请求和响应,包括设备状态更新、设备控制等。

- DeviceServlet:处理设备状态更新请求。

- ControlServlet:处理设备控制请求。

4. WebSocket 设计

WebSocket 用于实现客户端与服务器之间的实时通信。

- WebSocketServer:服务器端 WebSocket 处理类。

- WebSocketClient:客户端 WebSocket 处理类。

代码实现

1. 数据库连接

我们需要创建一个数据库连接类来连接 MySQL 数据库。

java

public class DBConnection {


private static final String URL = "jdbc:mysql://localhost:3306/smart_home";


private static final String USER = "root";


private static final String PASSWORD = "password";

public static Connection getConnection() throws SQLException {


return DriverManager.getConnection(URL, USER, PASSWORD);


}


}


2. JSP 页面

index.jsp:

jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


<html>


<head>


<title>智能家居控制</title>


<script src="https://cdn.jsdelivr.net/npm/sockjs-client/dist/sockjs.min.js"></script>


<script src="https://cdn.jsdelivr.net/npm/stompjs/lib/stomp.min.js"></script>


</head>


<body>


<h1>智能家居控制</h1>


<div id="deviceList"></div>


<script>


var socket = new SockJS('/ws');


var stompClient = Stomp.over(socket);


stompClient.connect({}, function (frame) {


console.log('Connected: ' + frame);


stompClient.subscribe('/topic/devices', function (device) {


var devices = JSON.parse(device.body);


var deviceList = document.getElementById('deviceList');


deviceList.innerHTML = '';


devices.forEach(function (device) {


var div = document.createElement('div');


div.innerHTML = '设备名称:' + device.name + ',状态:' + device.status;


deviceList.appendChild(div);


});


});


});


</script>


</body>


</html>


control.jsp:

jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


<html>


<head>


<title>智能家居控制</title>


</head>


<body>


<h1>设备控制</h1>


<form action="ControlServlet" method="post">


<label for="deviceId">设备ID:</label>


<input type="text" id="deviceId" name="deviceId">


<label for="action">操作:</label>


<select id="action" name="action">


<option value="on">开启</option>


<option value="off">关闭</option>


</select>


<button type="submit">提交</button>


</form>


</body>


</html>


3. Servlet 实现

DeviceServlet.java:

java

@WebServlet("/DeviceServlet")


public class DeviceServlet extends HttpServlet {


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


Connection conn = null;


PreparedStatement ps = null;


ResultSet rs = null;


try {


conn = DBConnection.getConnection();


String sql = "SELECT FROM devices";


ps = conn.prepareStatement(sql);


rs = ps.executeQuery();


List<Device> devices = new ArrayList<>();


while (rs.next()) {


Device device = new Device();


device.setId(rs.getInt("id"));


device.setName(rs.getString("name"));


device.setStatus(rs.getString("status"));


devices.add(device);


}


response.setContentType("application/json");


response.getWriter().write(JSON.toJSONString(devices));


} catch (SQLException e) {


e.printStackTrace();


} finally {


try {


if (rs != null) rs.close();


if (ps != null) ps.close();


if (conn != null) conn.close();


} catch (SQLException e) {


e.printStackTrace();


}


}


}


}


ControlServlet.java:

java

@WebServlet("/ControlServlet")


public class ControlServlet extends HttpServlet {


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {


String deviceId = request.getParameter("deviceId");


String action = request.getParameter("action");


Connection conn = null;


PreparedStatement ps = null;


try {


conn = DBConnection.getConnection();


String sql = "UPDATE devices SET status = ? WHERE id = ?";


ps = conn.prepareStatement(sql);


ps.setString(1, action);


ps.setInt(2, Integer.parseInt(deviceId));


int result = ps.executeUpdate();


if (result > 0) {


response.getWriter().write("操作成功");


} else {


response.getWriter().write("操作失败");


}


} catch (SQLException e) {


e.printStackTrace();


} finally {


try {


if (ps != null) ps.close();


if (conn != null) conn.close();


} catch (SQLException e) {


e.printStackTrace();


}


}


}


}


4. WebSocket 实现

WebSocketServer.java:

java

public class WebSocketServer {


private static final String WS_ENDPOINT = "/ws";


private static final String TOPIC_DEVICES = "/topic/devices";

public void startServer() {


Server server = new Server(8080);


WebServerSocketHandler wsHandler = new WebServerSocketHandler(WS_ENDPOINT) {


@Override


protected void onMessage(String message) {


// 处理消息


}

@Override


protected void onOpen(Session session, ServerEndpointConfig config) {


// 连接打开时订阅主题


StompSession stompSession = StompSessionHandlerAdapter.connect(session, new StompSessionHandlerAdapter() {


@Override


public void handleFrame(StompFrame frame) {


// 处理帧


}

@Override


public void handleException(Exception exception) {


// 处理异常


}

@Override


public void afterConnectionClosed(StompHeaders headers, Exception exception) {


// 连接关闭时取消订阅


stompSession.unsubscribe(TOPIC_DEVICES);


}


});


stompSession.subscribe(TOPIC_DEVICES, new DefaultStompFrameHandler());


}


};


server.setHandler(wsHandler);


server.start();


}


}


WebSocketClient.java:

java

public class WebSocketClient {


private static final String WS_ENDPOINT = "ws://localhost:8080/ws";

public void startClient() {


SockJS sockJS = new SockJS(WS_ENDPOINT);


StompClient stompClient = Stomp.over(sockJS);


stompClient.connect(new StompSessionHandlerAdapter() {


@Override


public void onOpen(StompSession session, StompHeaders headers) {


// 连接打开时订阅主题


session.subscribe("/topic/devices", new DefaultStompFrameHandler());


}

@Override


public void handleException(Exception exception) {


// 处理异常


}


});


}


}


总结

本文通过 JSP 和 WebSocket 技术实现了一个实时智能家居控制示例。在实际应用中,可以根据需求扩展功能,如添加更多设备类型、实现更复杂的控制逻辑等。随着物联网技术的不断发展,智能家居系统将更加智能化、便捷化,为人们的生活带来更多便利。