长连接的钟表程序

实验要求

实现1个钟表程序(服务),多个用户可以从该程序获得时间并在本地显示,用户也可以修改时间。

(1)用户程序可以在计算机上运行,也可以在手机上运行;

(2)至少3个用户程序可同时运行,时间每秒钟刷新;

   (3) 1个用户修改了时间,所有用户的时间都要随着被改变;

   (4) 推荐使用JavaScript、node.js、Websocket,以及Nginx实现;

   (5) 可能存在跨域问题。

实验步骤

1. 准备环境和安装依赖:

计算机上安装 Node.js 和 npm

创建一个新的文件夹,比如 "realtime-server",进入该文件夹。

在终端中执行以下命令以初始化一个新的 Node.js 项目:

npm init -y 

安装所需的依赖:

npm install express http ws moment cors 
2. 编写代码:

创建一个名为 server.js 的文件,并将提供的代码复制粘贴到该文件中。

3. 运行服务器:

在终端中运行以下命令启动服务器:

node server.js 
4. 连接到服务器:

可使用任何支持 WebSocket 的客户端连接到该服务器。可以使用浏览器的控制台或者 WebSocket 客户端工具,如 wscat

打开浏览器控制台或运行 wscat -c ws://localhost:8080(确保端口号与服务器代码中指定的一致)连接到服务器。

5. 接收当前时间:

一旦连接建立,服务器会发送当前时间给客户端。

6. 发送消息更新时间:

在客户端(浏览器控制台或 wscat)中发送一个符合 ISO 8601 格式的时间字符串,服务器会更新时间并广播给所有连接的客户端。

7. 观察时间更新:

你会看到连接的客户端接收到新的时间,并且每秒钟都会更新一次。

8. 测试不合法时间:

尝试发送一个不符合 ISO 8601 格式的字符串到服务器,你会看到服务器会打印出 "Invalid date format" 的错误信息。

9.结束实验:

关闭服务器,按下 Ctrl + C 终止运行 node server.js 的命令。

这样就能成功地建立了一个实时时间更新的 WebSocket 服务器,并能够通过客户端与其进行交互。

程序代码

服务端server.js

const express = require('express');
const http = require('http');
const WebSocket = require('ws');
const moment = require('moment');const app = express();
const server = http.createServer(app);
const wss = new WebSocket.Server({ server });
const cors = require('cors');let currentTime = moment();
let modifiedTime = null; // 变量用于存储用户修改后的时间
app.use(cors());wss.on('connection', (ws) => {ws.send(currentTime.toISOString());ws.on('message', (message) => {const messageStr = message.toString(); // 将接收到的消息转换为字符串if (moment(messageStr, moment.ISO_8601, true).isValid()) {modifiedTime = moment(messageStr);currentTime = modifiedTime; // 更新当前时间为用户修改后的时间wss.clients.forEach((client) => {if (client.readyState === WebSocket.OPEN) {client.send(currentTime.toISOString());}});} else {console.log('Invalid date format:', messageStr);}});
});setInterval(() => {if (modifiedTime) {currentTime = modifiedTime;} else {currentTime = moment();}wss.clients.forEach((client) => {if (client.readyState === WebSocket.OPEN) {client.send(currentTime.toISOString());}});
}, 1000);server.listen(8080, () => {console.log('Server started on port 8080');
});

客户端Real-clock.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Real-time Clock</title><script src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
</head>
<body><h1 id="clock"></h1><label for="newTime">Enter New Time:</label><input type="datetime-local" id="newTime" placeholder="YYYY-MM-DDTHH:mm"><button onclick="updateTime()">Update Time</button><script>const socket = new WebSocket('ws://localhost:8080');socket.onmessage = function(event) {const currentTime = moment(event.data).format('YYYY-MM-DD HH:mm:ss');document.getElementById('clock').innerText = currentTime;};function updateTime() {const inputDateTime = document.getElementById('newTime').value;const formattedDateTime = moment(inputDateTime, 'YYYY-MM-DDTHH:mm').toISOString();socket.send(formattedDateTime);}setInterval(() => {socket.send('update');}, 1000);</script>
</body>
</html>

实验截图

打开 HTML 页面:

将提供的 HTML 代码保存为Real-clock.html 文件,并在浏览器中打开。

2. 初始显示:

页面加载后,你会看到一个标题为 "Real-time Clock" 的页面,以及一个空白的时钟显示区域和一个用于输入新时间的输入框。

钟表程序

3. 连接到服务器:

页面加载后,客户端会尝试连接到 ws://localhost:8080 这个 WebSocket 服务器。

4. 接收当前时间:

一旦连接建立,服务器会发送当前时间给客户端,并显示在页面上的时钟区域。

三个浏览器窗口模拟三个进程

三个浏览器窗口模拟三个进程

5. 输入新时间:

在 "Enter New Time" 输入框中输入一个新的时间,格式为 "YYYY-MM-DDTHH

",例如 "2024-06-15T10:00"。

6. 更新时间:

点击 "Update Time" 按钮,客户端会将新时间发送到服务器,服务器接收并更新时间。

7. 观察时钟更新:

页面上的时钟区域会显示为新输入的时间。

8. 定时更新:

每隔一秒,客户端会向服务器发送一个 "update" 消息,服务器会将当前时间发送回客户端,页面上的时钟区域会持续更新。

9. 结束交互:

关闭浏览器标签或停止服务器,结束交互。

存在的问题:

在这个实验中,存在一些潜在的问题和改进空间:

- 时区处理:当前实现中并未考虑时区的处理,如果需要支持不同时区的用户,需要进一步处理时区转换和显示。

- 客户端错误处理:客户端发送的新时间格式错误时,并未提供友好的提示,用户可能无法得知输入的格式有误。

- 服务器端数据持久化:当前实现中,服务器端并未对时间数据进行持久化,一旦服务器重启,时间会被重置。可以考虑使用数据库或者其他持久化方式来保存时间数据。

 实验展望:

虽然这个实验已经实现了基本的实时时间更新功能,但仍有一些方面可以进一步改进和扩展:

- 用户体验优化:可以进一步改进页面布局和交互方式,使用户能够更方便地输入新时间,并提供更友好的界面反馈。

- 安全性考虑:在生产环境中,需要考虑 WebSocket 连接的安全性,防止恶意攻击和非授权访问。可以考虑添加身份验证、消息加密等安全机制。

- 性能优化:当前的实现每秒都向客户端发送时间更新,即使时间并未发生变化。可以通过在服务器端和客户端实现更智能的逻辑,减少不必要的数据传输,从而提升性能和效率。

实验总结:

在这个实验中,我们成功地构建了一个实时时间更新的 WebSocket 服务器,并通过一个 HTML 页面与之进行交互。以下是实验的主要收获和总结:

- 功能实现:通过使用 Express、WebSocket 和 Moment.js 等技术,我们成功地创建了一个实时时间更新的服务器,并能够通过 WebSocket 实现与客户端的实时通信。

- 页面交互:在 HTML 页面中,我们通过 WebSocket 接收来自服务器的时间更新,并能够通过输入框向服务器发送新的时间来更新时钟显示。

- 定时更新:我们实现了定时向服务器发送更新请求的功能,以保持页面上的时钟实时更新。

(笔者将会非常感谢大家来完善这个程序!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/852489.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android】Android系统性学习——Android系统架构

前言 部分内容参考《Android进阶解密》 – 刘望舒 1. Android版本 官方链接&#xff1a;https://developer.android.com/studio/releases/platforms 里面有各个版本的官方文档&#xff0c;有些新功能的用法在这里面。 现在做安卓11&#xff0c;有时候需要向下兼容 2. AOSP …

【Python】在运行中使用warnings.filterwarnings,可以忽略测试中遇到的问题

在 Python 中&#xff0c;warnings 是一个内置模块&#xff0c;用于发出有关程序执行的警告信息&#xff0c;这些警告信息通常是关于程序行为的潜在问题。 不过&#xff0c;这些问题通常不是致命的错误&#xff0c;只不过是展示我们代码中潜在的问题&#xff0c;或不推荐的做法…

软件架构搞好了,还用担心代码可读性差?

目录 一、架构的概念及由来 二、小系统也需要架构思想 三、实现架构的思路 一、架构的概念及由来 嵌入式软件架构是指在嵌入式系统中用于组织和管理软件组件的结构和设计。嵌入式软件架构的出现是为了解决嵌入式系统中软件复杂度和系统要求不断增加的挑战。以下是嵌入式软件架…

【STM32进阶笔记】GPIO端口

前段时间由于其他原因&#xff0c;专栏暂停更新了较长一段时间&#xff0c;现在恢复更新&#xff0c;争取继续为大家创造有价值的内容&#xff0c;期待大家的订阅关注&#xff0c;欢迎互相学习交流。 在STM32速成笔记系列专栏中其实已经对GPIO的一些必要知识进行了介绍&#xf…

GPT4O给Qwen2生成的高考作文打分56分,从“小白”进阶技术大神的开发者基于国产GPU推理模型效果可还行?

OpenI启智社区上线的【芯动开源】首场活动-天数智芯挑战专场即将迎来最后一周的冲刺阶段&#xff0c;自2024年5月27日上线以来&#xff0c;这期间&#xff0c;我们见证了天数智芯通用GPU加速卡在适配AI模型方面的无限可能与开发者们开源精神的璀璨光辉。 在短短的两周时间里&a…

代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、 108.将有序数组转换为二叉搜索树、 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目链接&#xff1a;669. 修剪二叉搜索树 文档讲解&#xff1a;代码随想录 状态&#xff1a;还可以 思路&#xff1a; 如果节点的值在[low, high]之间&#xff0c;则递归修剪它的左子树和右子树。 节点值小于low&#xff1a;如果节点的值小于low&#xff…

智慧工厂自动装车解决方案:H13三维轮廓扫描激光雷达

激光雷达在智慧工厂自动装车的应用场景在智慧工厂的自动装车场景中&#xff0c;激光雷达的应用显得尤为关键。这种技术以其精确的测量和定位能力&#xff0c;助力自动化装车的每一个环节&#xff0c;大大提高了装车的效率和准确性。 首先&#xff0c;激光雷达在车辆定位方面发挥…

[next.js] svgr/webpack

nextjs如何配置svg文件&#xff0c;使其像react组件一样导入? 当前next.js 开发环境我使用了--turbo 来开启turbopack加速文件构建&#xff0c;所以之前的一些webpack loader之类的无法正常工作。通过搜索发现一般都是使用svgr/webpack来处理svg&#xff0c;打开svgr官网发现…

vscode 连接 GitHub

文章目录 连接 GitHub一、通过 SSH 连接 github二、通过 HTTPS 连接 github 连接 GitHub 在 vscode 中首次使用 git push 命令时会要求输入 github 账户的 username 和 password&#xff0c;这种基本身份验证在 2021.8.13 以前还是可以的&#xff0c;之后的话&#xff0c;就会…

Luma AI 推出梦幻机:据说吊打Sora和快手可灵(KLING)|TodayAI

近日&#xff0c;美国初创公司 Luma AI 宣布推出其最新的文本生成视频工具——梦幻机&#xff08;Dream Machine&#xff09;。这一消息发布的时间正好在中国科技公司快手推出其文本生成视频模型可灵&#xff08;KLING&#xff09;几天之后&#xff0c;标志着视频生成领域的又一…

Android Compose 十一:常用组件列表 compose自己个的 下拉刷新

列表下拉刷新 material3 还没有下拉刷新功能material:1.3.0 之后 swiperefresh 被弃用 被PullRefresh替代使用PullRefresh 需要添加依赖 implementation ‘androidx.compose.material:material:1.6.8’ 先上代码 var refreshing by remember {mutableStateOf(false)} val…

线性代数|机器学习-P12Ax=b条件下x最小值问题

文章目录 1. Axb下的最值问题-图形转换2. Gram-Schmidt 标准形3. 迭代法-Krylov子空间法 1. Axb下的最值问题-图形转换 假设我们有一个直线方程如下&#xff1a; 3 x 1 4 x 2 1 \begin{equation} 3x_14x_21 \end{equation} 3x1​4x2​1​​ 在二维平面上&#xff0c;各个范…

集成学习 #数据挖掘 #Python

集成学习是一种机器学习方法&#xff0c;它通过结合多个模型的预测结果来提高整体性能和稳定性。这种方法的主要思想是“集合智慧”&#xff0c;通过将多个模型&#xff08;比如决策树、随机森林、梯度提升机等&#xff09;的预测集成起来&#xff0c;可以减少单个模型的过拟合…

C# WPF入门学习主线篇(三十一)—— MVVM模式简介

C# WPF入门学习主线篇&#xff08;三十一&#xff09;—— MVVM模式简介 MVVM&#xff08;Model-View-ViewModel&#xff09;模式是WPF开发中的一种重要架构模式。它通过将用户界面&#xff08;View&#xff09;与业务逻辑和数据&#xff08;Model&#xff09;分离&#xff0c;…

【文献阅读】一种多波束阵列重构导航抗干扰算法

引言 针对导航信号在近地表的信号十分微弱、抗干扰能力差的问题&#xff0c;文章提出了自适应波束形成技术。 自适应波束形成技术可以分为调零抗干扰算法和多波束抗干扰算法。 调零抗干扰算法主要应用功率倒置技术&#xff0c;充分利用导航信号功率低于环境噪声功率的特点&…

三个pdf工具和浏览软件(pdftk,muppdf,epdfview)

安装pdftk pdftk是一款功能强大的PDF处理工具&#xff0c;主要用于对PDF文件进行各种操作。它提供了丰富的功能&#xff0c;包括但不限于合并、拆分、旋转、加密、解密、添加水印、从PDF文档中解出附件等。pdftk分为图形界面版本和命令行版本&#xff0c;适用于不同的用户需求…

使用ant-design/cssinjs向plasmo浏览器插件的内容脚本content中注入antd的ui组件样式

之前写过一篇文章用来向content内容脚本注入antd的ui&#xff1a;https://xiaoshen.blog.csdn.net/article/details/136418199&#xff0c;但是方法就是比较繁琐&#xff0c;需要将antd的样式拷贝出来&#xff0c;然后贴到一个单独的css样式文件中&#xff0c;然后引入到内容脚…

活动会议发布平台,让你我的距离再近点

随着科技、经济的不断发展&#xff0c;生活水平的不断提高&#xff0c;人们不仅在工作中追求快捷高效的工作工具&#xff0c;生活中对参加各项活动的热情也不断提升。活动会议发布平台以其便捷、高效的使用方式被越来越多人采用。 一&#xff0e; 活动会议发布平台的用户画像 …

博物馆藏品管理的重要性

博物馆是人们了解历史文化、传承文明的重要场所。而博物馆的藏品管理是博物馆的核心工作之一&#xff0c;对于展现博物馆的魅力、吸引观众的眼球有着至关重要的影响。并且博物馆藏品管理是一项复杂且专业的工作&#xff0c;它涉及到多个方面&#xff0c;包括但不限于藏品的收集…

租房项目之并发缺失数据问题

前奏&#xff1a;本项目是一个基于django的租房信息获取项目。本次博客牵扯到两个版本&#xff0c;集中式分布以及分布式部署&#xff08;两个版本的ui不同&#xff0c;集中式用的是老版ui&#xff0c;分布式使用的是新版ui&#xff09;&#xff1b; 项目链接&#xff1a;http…