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日

相关文章

  • Android学习笔记45之gson解析json

    Android学习笔记45之gson解析json 简介 Google推出的Gson是一个使用Java语言实现的Json解析库,可以将Json字符串自动解析成Java对象,或者将Java对象转成Json字符串。在Android开发中,使用Gson解析Json数据是非常常见的操作。本文将介绍Gson解析Json的完整攻略。 配置Gson库 在项目的build.g…

    Java 2023年5月26日
    00
  • SSH整合中 hibernate托管给Spring得到SessionFactory

    需要完成整合的总体目的: 将SSH框架中的Hibernate托管给Spring,获取SessionFactory对象并使用SessionFactory对象创建与数据库的会话。 为了达到使用Hibernate的目的,还需要配置 数据源、事务管理器、持久化类映射等。 达到以上目的,步骤如下: 1. 引入依赖 在POM文件中添加 Hibernate、Spring、…

    Java 2023年5月20日
    00
  • Java Security Manager的作用是什么?

    Java Security Manager是Java平台提供的一种安全策略机制,用于限制正在运行的Java应用程序对系统资源的访问。Java Security Manager具体的作用包括但不限于以下几个方面: 控制Java应用程序的访问权限:Java Security Manager可以控制Java应用程序所需要的权限,包括文件读写、网络连接、执行操作等等…

    Java 2023年5月11日
    00
  • 一篇文章带你搞定JAVA Maven

    一篇文章带你搞定JAVA Maven 什么是Maven? Maven是一款基于Java平台的构建工具,它可以帮助开发者自动化地构建、打包、发布和管理Java项目中的各种依赖。使用Maven可以大大简化Java项目的开发和维护。Maven有一个中心仓库,里面包含了主流的Java依赖。我们可以通过Maven来自动从中心仓库中下载所需的依赖,避免了手动下载和管理依…

    Java 2023年5月19日
    00
  • Java泛型的概念、定义与运行方法分析

    下面是关于Java泛型的完整攻略。 1. Java泛型的概念 Java泛型可以理解为参数化类型的一种表现方式,它是为了解决在类或方法中,处理参数类型不确定的问题而出现的。Java泛型机制的运作就是在编译期间通过类型擦除来实现的,它可以确保程序员在编译时期间对类型进行校验,让代码更加健壮和安全。 2. Java泛型的定义 Java泛型使用尖括号 <&gt…

    Java 2023年5月26日
    00
  • 面向对象可视化工具:UML类图

    1. UML类图 UML(Unified Modeling Language,统一建模语言),用来描述软件模型和架构的图形化语言。 常用的UML工具软件有PowerDesinger、Rose和Enterprise Architect。 UML工具软件不仅可以绘制软件开发中所需的各种图表,还可以生成对应的源代码。 在软件开发中,使用UML类图可以更加直观地描述…

    Java 2023年4月27日
    00
  • SpringBoot2零基础到精通之数据与页面响应

    SpringBoot2 零基础到精通之数据与页面响应 SpringBoot是一款快速开发框架,它的特点在于能够自动配置和约定大于配置。通过本文,你将学会: 在SpringBoot项目中,利用控制器将数据响应到页面上; 配置模板引擎,在页面上渲染动态数据; 将数据响应成Json,供前端异步获取。 1. 添加依赖 在你的SpringBoot项目的pom.xml文…

    Java 2023年5月19日
    00
  • java实现多线程交替打印两个数

    要实现多线程交替打印两个数,可以使用Java提供的线程同步机制来完成。具体步骤如下: 1.创建两个线程对象,一个线程对象负责打印奇数,另一个线程对象负责打印偶数。 2.使用synchronized关键字来实现线程同步,确保只有一个线程在打印时另一个线程处于等待状态。 3.使用wait和notifyAll方法来实现线程同步。当一方线程打印完后调用wait方法使…

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