WebSocket实现数据库更新时前端页面刷新

实现WebSocket实时刷新前端页面的步骤如下:

  1. 前端客户端通过WebSocket与服务器端建立连接。

在前端,可以使用WebSocket API来建立与服务器端的连接。例如:

const ws = new WebSocket('ws://localhost:3000');
  1. 服务端通过WebSocket与数据库建立连接。

服务端需要监听客户端的WebSocket连接请求,并在成功建立连接后,再与数据库建立连接。例如:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3000 });

wss.on('connection', function connection(ws) {
  // 建立连接之后,与数据库建立连接,例如使用mysql的连接池
  const mysql = require('mysql');
  const pool  = mysql.createPool({
    connectionLimit : 10,
    host            : 'localhost',
    user            : 'root',
    password        : 'password',
    database        : 'database'
  });

  // 监听WebSocket消息
  ws.on('message', function incoming(message) {
    // 处理消息,例如更新数据库操作
    pool.query('UPDATE table SET column=value WHERE id = ?', [message], function (error, results, fields) {
      if (error) throw error;
      console.log('Updated ' + results.affectedRows + ' rows');
    });

    // 将更新通知所有连接的客户端
    wss.clients.forEach(function each(client) {
      if (client.readyState === WebSocket.OPEN) {
        client.send('update'); // 通知客户端刷新页面
      }
    });
  });
});
  1. 前端客户端通过WebSocket监听服务端的消息,以实现实时刷新前端页面。

客户端需要监听服务端发送的消息,并在收到消息时刷新页面。例如:

const ws = new WebSocket('ws://localhost:3000');

ws.onmessage = function(event) {
  if (event.data === 'update') {
    // 收到更新通知,刷新页面
    window.location.reload();
  }
};

示例1:

假设前端页面有一个表格,用于显示数据库中的数据,这个表格是通过AJAX从后端获取的。当数据库中的数据发生变化时,需要实时更新表格中的数据。

前端代码:

<!DOCTYPE html>
<html>
<head>
  <title>WebSocket实时更新页面示例</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        items: []
      },
      created: function() {
        // 通过AJAX获取数据
        this.fetchData();

        // 建立WebSocket连接
        const ws = new WebSocket('ws://localhost:3000');

        // 监听WebSocket消息
        ws.onmessage = function(event) {
          if (event.data === 'update') {
            // 收到更新通知,重新获取数据
            this.fetchData();
          }
        }.bind(this); // 注意这里bind(this)是为了让回调函数中的this指向Vue实例对象
      },
      methods: {
        fetchData: function() {
          // 发送AJAX请求
          fetch('/data')
            .then(response => response.json())
            .then(data => {
              this.items = data;
            });
        }
      }
    });
  </script>
</head>
<body>
  <div id="app">
    <table>
      <thead>
        <tr>
          <th>Name</th>
          <th>Age</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="item in items">
          <td>{{ item.name }}</td>
          <td>{{ item.age }}</td>
        </tr>
      </tbody>
    </table>
  </div>
</body>
</html>

后端代码:

const express = require('express');
const app = express();
const http = require('http').Server(app);
const WebSocket = require('ws');
const wss = new WebSocket.Server({ server: http });

// 模拟数据库中的数据
const items = [{ name: 'Alice', age: 20 }, { name: 'Bob', age: 22 }, { name: 'Charlie', age: 25 }];

// 提供获取数据的API
app.get('/data', function(req, res) {
  res.json(items);
});

// 监听WebSocket连接
wss.on('connection', function connection(ws) {
  console.log('Client connected.');

  // 监听WebSocket消息(这里假设收到消息时需要修改数据库中的数据)
  ws.on('message', function incoming(message) {
    console.log('Received message:', message);
    // 修改数据(这里省略了更新数据库的代码)
    items.push({ name: 'David', age: 28 });
    // 将更新通知所有连接的客户端
    wss.clients.forEach(function each(client) {
      if (client.readyState === WebSocket.OPEN) {
        client.send('update'); // 通知客户端刷新页面
      }
    });
  });
});

http.listen(3000, function() {
  console.log('Server listening on http://localhost:3000');
});

示例2:

假设前端页面有一个留言板功能,当用户在留言板中发表新留言时,需要实时更新页面中的留言列表。

前端代码:

<!DOCTYPE html>
<html>
<head>
  <title>WebSocket实时更新页面示例</title>
  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        messages: []
      },
      created: function() {
        // 建立WebSocket连接
        const ws = new WebSocket('ws://localhost:3000');

        // 监听WebSocket消息
        ws.onmessage = function(event) {
          if (event.data === 'update') {
            // 收到更新通知,重新获取留言列表
            this.fetchMessages();
          } else {
            // 收到新留言
            const message = JSON.parse(event.data);
            this.messages.unshift(message); // 将新留言插入到列表头部
          }
        }.bind(this); // 注意这里bind(this)是为了让回调函数中的this指向Vue实例对象

        // 获取留言列表
        this.fetchMessages();
      },
      methods: {
        fetchMessages: function() {
          // 发送AJAX请求
          fetch('/messages')
            .then(response => response.json())
            .then(data => {
              this.messages = data;
            });
        },
        postMessage: function() {
          const message = { username: this.username, content: this.content };
          // 发送WebSocket消息
          const ws = new WebSocket('ws://localhost:3000');
          ws.onopen = function() {
            ws.send(JSON.stringify(message));
          };
        }
      }
    });
  </script>
</head>
<body>
  <div id="app">
    <div>
      <input v-model="username" placeholder="请输入用户名">
      <textarea v-model="content" placeholder="请输入留言内容"></textarea>
      <button @click="postMessage">发表留言</button>
    </div>
    <ul>
      <li v-for="message in messages">
        <strong>{{ message.username }}</strong>:{{ message.content }}
      </li>
    </ul>
  </div>
</body>
</html>

后端代码:

const express = require('express');
const app = express();
const http = require('http').Server(app);
const WebSocket = require('ws');
const wss = new WebSocket.Server({ server: http });

// 模拟数据库中的留言
const messages = [
  { username: 'Alice', content: 'Hello' },
  { username: 'Bob', content: 'Hi, Alice' }
];

// 提供获取留言列表的API
app.get('/messages', function(req, res) {
  res.json(messages);
});

// 监听WebSocket连接
wss.on('connection', function connection(ws) {
  console.log('Client connected.');

  // 发送留言列表
  ws.send(JSON.stringify(messages));

  // 监听WebSocket消息(这里假设收到消息时需要添加新留言到数据库中)
  ws.on('message', function incoming(message) {
    console.log('Received message:', message);
    // 添加新留言(这里省略了更新数据库的代码)
    const newMessage = { username: 'Charlie', content: message };
    messages.push(newMessage);
    // 将更新通知所有连接的客户端
    wss.clients.forEach(function each(client) {
      if (client.readyState === WebSocket.OPEN) {
        client.send(JSON.stringify(newMessage)); // 通知客户端添加新留言
        client.send('update'); // 通知客户端刷新页面
      }
    });
  });
});

http.listen(3000, function() {
  console.log('Server listening on http://localhost:3000');
});

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:WebSocket实现数据库更新时前端页面刷新 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 关于@ResponseBody 默认输出的误区的解答

    当使用@ResponseBody注解返回结果时,Spring默认使用Jackson库将返回结果直接转换为JSON格式输出。这种行为经常会造成一些误解,下面针对一些误区进行解答。 误解一:@ResponseBody会自动添加@RestController? @RestController注解是@Controller和@ResponseBody的结合体,用于指示…

    Java 2023年5月26日
    00
  • JSP连接MySQL数据库详细步骤

    下面为您详细讲解JSP连接MySQL数据库的步骤。 1. 准备工作 在开始连接MySQL数据库之前,需要先进行准备工作: 安装MySQL数据库 下载MySQL的Java Connector(JDBC)驱动 2. 导入JDBC驱动包 将下载好的JDBC驱动包(.jar文件)导入到您的web项目中。您可以将该驱动包放置在WEB-INF/lib文件夹下,或者添加到…

    Java 2023年5月20日
    00
  • Java 房屋租赁系统的实现流程

    下面是Java房屋租赁系统的实现流程的完整攻略。 系统设计 功能需求 房源管理 租客管理 订单管理 支付管理 技术需求 JDK版本:1.8以上 数据库:MySQL 框架:Spring Boot+Mybatis 开发工具:eclipse/idea 数据库设计 该系统需要设计三张表:房源表、租客表、订单表。其结构设计如下: 房源表 CREATE TABLE `h…

    Java 2023年5月19日
    00
  • java 实现局域网文件传输的实例

    下面是 “Java实现局域网文件传输的实例” 的完整攻略: 1. 确定文件传输协议 Java实现局域网文件传输,首先需要确定文件传输所采用的协议。常用的有TCP、UDP和HTTP等协议。 在这里我们采用TCP协议,因为TCP协议是可靠的传输协议,可以确保数据传输的正确性和完整性。 2. 客户端编写 客户端需要完成以下步骤:1. 创建Socket对象,指定服务…

    Java 2023年5月19日
    00
  • 使用java实现http多线程断点下载文件(一)

    我来为您详细讲解“使用java实现http多线程断点下载文件(一)”的完整攻略。 简介 HTTP多线程断点下载是一种常见的文件下载方式,可以大大提高文件下载速度并且在网络中断等情况下可以将下载进度保存,下次重新下载时可以从上次下载的位置继续下载。本文将介绍使用java实现HTTP多线程断点下载文件的方法。 准备工作 在实现HTTP多线程断点下载文件之前,我们…

    Java 2023年5月18日
    00
  • 关于解决iframe标签嵌套问题的解决方法

    关于解决 iframe 标签嵌套问题的解决方法(完整攻略) 问题概述 在使用 iframe 标签嵌套时,可能会遇到以下一些问题: 嵌套多层 iframe 会导致网页加载速度变慢; 在 iframe 中进行跨域请求时,可能会受到浏览器安全策略的限制; iframe 内容与外部网页内容的样式、布局等问题。 本攻略主要介绍如何解决 iframe 标签嵌套问题。 解…

    Java 2023年6月15日
    00
  • Java Apache Commons报错“ZipUnsupportMethodException”的原因与解决方法

    “DuplicateActionException”是Java的Struts框架中的一个异常,通常由以下原因之一引起: Action重复:如果存在重复的Action,则可能会出现此异常。例如,可能会在配置文件中定义两个名称相同的Action。 以下是两个实例: 例1 如果存在重复的Action,则可以尝试更改Action名称以解决此问题。例如,在Struts…

    Java 2023年5月5日
    00
  • JDBC工具类实现登录功能

    以下是“JDBC工具类实现登录功能”的完整攻略: 1. 什么是JDBC工具类 JDBC是Java Database Connectivity的缩写,是Java标准中用于操作关系型数据库的API。JDBC提供了一组用于连接数据库、执行SQL语句和处理结果集的类和接口。为了方便使用JDBC,我们可以创建一个JDBC工具类,该类提供了一组常用的方法,封装了JDBC…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部