当前位置: 首页 > article >正文

JavaScript:游戏开发的利器

在近年来的科技迅速发展中,JavaScript 已逐渐成为游戏开发领域中最受欢迎的编程语言之一。它的跨平台特性、广泛的社区支持、丰富的库和框架使得开发者能够快速、有效地创建各种类型的游戏。本文将深入探讨 JavaScript 在游戏开发中的优势。

一、跨平台支持

JavaScript 最显著的优势之一是其跨平台支持。得益于 HTML5 和 WebGL 的广泛采用,开发者可以通过浏览器直接运行 JavaScript 游戏,无需编译。无论是 PC、移动设备,还是甚至游戏机,JavaScript 都能无缝适配,大幅降低了开发和维护多个版本的成本。

1.1 HTML5 和 WebGL

HTML5 使得在浏览器中嵌入音频、视频和图形变得更加简单,而 WebGL 则提供了硬件加速的 2D 和 3D 渲染能力。这意味着开发者可以轻松创建高质量的图形内容,从而提升游戏的整体体验。

二、强大的生态系统

JavaScript 拥有丰富的生态系统,各种库和框架可以加速开发流程。

2.1 常用游戏引擎

  • Phaser:一个轻量级的 HTML5 游戏框架,特别适合快速构建 2D 游戏。Phaser 提供了易于使用的 API 和大量的示例文档,开发者可以迅速上手。

  • Three.js:一个广泛使用的 JavaScript 3D 图形库,非常适合开发 3D 游戏和可视化项目。Three.js 提供了丰富的功能,如光影效果、物理引擎 ,可用于创建生动的 3D 世界。

  • Babylon.js:一个功能强大的 3D 游戏引擎,专注于高效的图形渲染,适合高性能的游戏开发。它不仅支持常规的 3D 图形,还提供了 WebXR 支持,用于开发虚拟现实(VR)和增强现实(AR)应用。

三、简洁易用的语法

JavaScript 的语法设计旨在提高开发者的工作效率。作为一门高层次的编程语言,JavaScript 以其简洁明了的语法,降低了学习难度,使得新手能够快速上手。而同时,其灵活性和强大的功能也吸引了众多经验丰富的开发者。

3.1 自然的语法结构

JavaScript 的语法与许多其他编程语言相似,尤其是 C 语言系列,熟悉其他语言的开发者在学习 JavaScript 时可以轻松适应。例如,使用 {} 定义代码块,使用 function 关键字定义函数,都与 C/C++ 语言中的结构类似。这样的设计使得开发者能够专注于游戏逻辑的实现,而不是花费大量时间在语言细节上。

3.2 ES6+ 的引入

ES6(ECMAScript 2015)及其之后的版本为 JavaScript 带来了许多强大的特性。例如:

  • 箭头函数(Arrow Functions) :简化了函数的书写方式,特别是在需要传递回调函数时。例如:

    const add = (a, b) => a + b;
  • 解构赋值(Destructuring Assignment) :可以轻松提取数组或对象内的值,提高了代码的可读性和简洁性。例如:

    javascript

    const point = { x: 10, y: 20 };
    const { x, y } = point;
  • 模块化(Modules) :通过 import 和 export 语法,开发者可以将代码划分为模块,更好地组织和管理代码。这种模块化结构不仅提升了代码的可维护性,同时也利于团队协作,多个开发者可以在不同的模块上并行工作。

3.3 异步编程的优雅处理

现代 JavaScript 提供了对异步编程的优雅支持,如 Promise 和 async/await。游戏开发中,许多操作(如网络请求、资源加载)都是异步的,使用传统的回调函数往往会导致“回调地狱”。

  • Promise 能够以链式调用的方式处理异步操作,代码可读性大大提高:

    javascript

    fetch('/api/data').then(response => response.json()).then(data => console.log(data)).catch(error => console.error(error));
  • 使用 async/await,开发者几乎可以像处理同步代码一样处理异步操作,使逻辑更加清晰:

    javascript

    async function fetchData() {try {const response = await fetch('/api/data');const data = await response.json();console.log(data);} catch (error) {console.error(error);}
    }

通过这些高级特性,JavaScript 使得游戏逻辑的编写不仅高效,而且易于理解,从而能够让开发者更集中在游戏的设计和玩法上。

四、实时性和互动性

在当今游戏开发中,用户体验和实时互动性是游戏成功的关键因素之一。JavaScript 在这方面的能力赋予了开发者创造生动、有趣的游戏环境的能力。

4.1 事件驱动编程模型

JavaScript 是一门事件驱动的语言,这意味着它能够对用户的输入(如鼠标点击、键盘按键等)进行实时响应。在游戏开发中,开发者能够轻松为不同的游戏事件绑定处理函数,实现流畅的用户体验。

例如,在一个简单的游戏中,开发者可以绑定键盘事件以使角色移动:

javascript

document.addEventListener('keydown', (event) => {if (event.key === 'ArrowUp') {player.moveUp();} else if (event.key === 'ArrowDown') {player.moveDown();}
});

这种简洁的事件处理机制使得游戏世界动态化,用户的每一次操作都会立即影响游戏状态。

4.2 实时通信的实现

在多人游戏中,实时通信至关重要。JavaScript 的 Socket.io 库使得开发者能够简便地实现客户端和服务器之间的双向通信。Socket.io 基于 WebSocket 协议,可以在客户端和服务器之间快速传递消息,从而使得实时互动成为可能。

例如,在一个简单的多人游戏中,玩家的位置信息可以实时同步到服务器,并在其他玩家的客户端上更新:

javascript

socket.emit('player move', { id: player.id, x: player.x, y: player.y });

服务器接收到信息后,可以将位置更新发送给所有其他客户端:

javascript

socket.on('player move', (data) => {updatePlayerPosition(data.id, data.x, data.y);
});

这种低延迟的通信方式为开发者提供了实现顺畅游戏体验的基础,让不同玩家能够在同一个虚拟世界中实时交互。

4.3 使用 WebSockets 实现低延迟游戏

WebSockets 提供了一条持久化的连接,与传统的 HTTP 请求不同,WebSockets 允许服务器主动向客户端推送数据。这使得游戏的实时性得到了极大的提升,特别适合需要频繁更新的场景。

例如,一个实时战略游戏中,服务器可以向所有玩家推送实时的游戏状态更新,包括资源的消耗、玩家之间的互动等。这种方式比传统的轮询方式更加高效、响应迅速,极大提升了游戏的实时性和互动性。

4.4 动态内容更新

JavaScript 的支持还使得游戏中的动态内容更新变得简单。开发者可以在游戏运行时,实时更新游戏元素,如分数、状态、角色属性等。通过简单的 DOM 操作(如添加、移除或修改元素),便可以即时反映玩家的动作,提升游戏的互动感:

javascript

scoreElement.innerText = `Score: ${score}`;

这种动态更新的能力,不但提升了游戏的沉浸感,更使得开发者能够在游戏运行过程中不断优化用户体验。

JavaScript 的简洁易用的语法和卓越的实时性、互动性,使其成为游戏开发中的利器。通过这些特性,开发者不仅可以轻松编写出复杂的游戏逻辑,还能够为玩家创造流畅、引人入胜的实时游戏体验。在游戏设计中,充分利用 JavaScript 的这些优势,可以大大增强玩家的参与感和游戏的整体质量。

五、与后端技术的结合

JavaScript 的强大不仅体现在前端开发中,它与后端技术的结合使得游戏开发更具灵活性和高效性。通过与服务器端技术的无缝集成,开发者能够实现复杂的游戏功能,如多人游戏、实时数据存储和动态内容更新等。得益于 JavaScript 的全栈开发能力,前后端的协作更加流畅,开发周期和维护成本大大降低。

5.1 使用 Node.js 构建高效后端

Node.js 是一种基于事件驱动和非阻塞 I/O 模型的服务器端 JavaScript 运行环境,非常适合处理高并发、低延迟的请求。在游戏开发中,Node.js 可以用来构建高效的后端服务,尤其适用于需要实时通信和快速响应的游戏。

例如,在多人在线游戏中,服务器需要频繁地处理客户端的请求并及时反馈。Node.js 的异步 I/O 模型使得每个请求的处理不会阻塞其他操作,从而大大提升了服务器的响应能力。

5.1.1 高并发处理

Node.js 通过事件循环和单线程的设计,能够处理大量的并发请求。对于多人在线游戏,尤其是大规模游戏环境中,服务器需要支持成千上万玩家的实时互动。Node.js 的非阻塞 I/O 机制能够在不增加线程的情况下处理成千上万的并发请求,这对于游戏开发者来说是一个巨大的优势。

5.1.2 实时通信

Node.js 与 WebSocket 的结合,为实时通信提供了强大的支持。在多人游戏中,玩家的操作和状态需要迅速传递给其他玩家。通过 WebSocket,Node.js 能够保持与客户端的持久连接,实现低延迟、实时的消息推送。例如,在一个战斗类多人游戏中,玩家的攻击信息、位置变化等可以通过 WebSocket 实时同步给所有参与者,保持游戏的流畅性和互动性。

javascript

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', ws => {ws.on('message', message => {console.log(`received: ${message}`);// 将消息广播给所有连接的客户端wss.clients.forEach(client => {if (client !== ws && client.readyState === WebSocket.OPEN) {client.send(message);}});});
});

通过以上代码,Node.js 与 WebSocket 协同工作,能轻松实现多人游戏中的实时消息广播机制。

5.2 使用 Express 构建 API

Express 是一个简洁且强大的 Node.js Web 应用框架,它为构建 RESTful API 提供了丰富的功能。对于一个游戏来说,很多功能需要通过 API 与后端进行交互,如玩家数据存储、排行榜、物品购买等。Express 可以帮助开发者快速搭建一个轻量级的后端服务,方便与前端进行数据交互。

5.2.1 数据存取接口

游戏中的用户数据、玩家进度、物品信息等都需要存储在服务器端。通过 Express,开发者可以快速设计并实现 API 接口,处理客户端发送的数据。例如:

javascript

const express = require('express');
const app = express();
const bodyParser = require('body-parser');app.use(bodyParser.json());// 存储玩家数据
app.post('/save-progress', (req, res) => {const playerData = req.body;// 假设保存进度到数据库savePlayerDataToDatabase(playerData).then(() => {res.status(200).send('Progress saved!');}).catch((err) => {res.status(500).send('Error saving progress.');});
});// 获取排行榜
app.get('/leaderboard', (req, res) => {getLeaderboard().then((data) => {res.status(200).json(data);}).catch((err) => {res.status(500).send('Error retrieving leaderboard.');});
});app.listen(3000, () => console.log('Server is running on port 3000'));

通过这样的 API,前端游戏客户端可以与服务器进行数据交互,实时保存玩家的游戏进度、获取排行榜数据等。

5.2.2 用户认证和授权

许多游戏需要用户注册、登录、权限控制等功能,Express 能够轻松实现这些功能。例如,通过与 Passport.js 等身份验证中间件集成,开发者可以为游戏提供完善的身份认证和授权机制,确保只有经过授权的玩家才能访问特定的游戏内容。

javascript

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;// 设置本地登录策略
passport.use(new LocalStrategy((username, password, done) => {// 假设我们通过数据库验证用户名和密码findUserByUsername(username).then(user => {if (!user || user.password !== password) {return done(null, false, { message: 'Invalid credentials' });}return done(null, user);});
}));app.post('/login', passport.authenticate('local', {successRedirect: '/dashboard',failureRedirect: '/login',
}));

通过这些简单的步骤,Express 能够帮助开发者快速构建用户身份认证和游戏权限控制系统。

5.3 数据库交互和存储

对于大多数游戏来说,持久化存储是必不可少的。玩家的游戏进度、物品数据、排名信息等都需要存储在数据库中。在 JavaScript 后端开发中,Node.js 与数据库的结合可以通过多种方式实现。

5.3.1 使用 MongoDB 存储玩家数据

MongoDB 是一个常用的 NoSQL 数据库,具有灵活的文档模型,适合存储大量动态的、结构不完全一致的数据。对于游戏而言,玩家的数据(如角色信息、物品、得分等)通常具有不确定的结构,MongoDB 可以方便地存储这些数据。

例如,可以使用 MongoDB 存储玩家的进度信息:

javascript

const mongoose = require('mongoose');
const Player = mongoose.model('Player', new mongoose.Schema({name: String,level: Number,score: Number,items: [String]
}));app.post('/save-progress', (req, res) => {const { name, level, score, items } = req.body;const newPlayer = new Player({ name, level, score, items });newPlayer.save().then(() => {res.status(200).send('Player progress saved!');}).catch((err) => {res.status(500).send('Error saving progress.');});
});
5.3.2 使用 MySQL 存储结构化数据

如果游戏数据有较为固定的结构,关系型数据库如 MySQL 可能更加合适。例如,排行榜、物品商店等功能通常需要使用关系型数据库进行存储和查询。Node.js 可以通过 mysql2 或 sequelize 等库轻松与 MySQL 进行交互。

javascript

const mysql = require('mysql2');
const connection = mysql.createConnection({ host: 'localhost', user: 'root', database: 'game' });// 查询排行榜
app.get('/leaderboard', (req, res) => {connection.query('SELECT * FROM leaderboard ORDER BY score DESC LIMIT 10', (err, results) => {if (err) {res.status(500).send('Error retrieving leaderboard.');} else {res.status(200).json(results);}});
});

通过与数据库的紧密结合,开发者可以实现数据的可靠存储和高效查询,保证游戏的长期运营。

JavaScript 与后端技术的结合极大地提升了游戏开发的灵活性和效率。通过 Node.js 的异步 I/O 和 WebSocket 支持,开发者可以轻松处理高并发、实时数据交换等需求。而 Express、MongoDB、MySQL 等工具的使用,进一步加强了游戏的后台服务能力。借助 JavaScript 的全栈开发能力,开发者可以快速构建出功能强大的游戏应用,为玩家提供更加丰富和实时的游戏体验。

六、结论

综上所述,JavaScript 作为一款强大的编程语言,以其跨平台能力、丰富的生态系统、简洁的语法、实时互动性以及与后端技术的无缝结合,成为游戏开发的利器。无论是初学者还是资深开发者,都可以利用 JavaScript 的强大功能,实现各类创意游戏。未来,随着技术的进一步发展,JavaScript 将继续引领游戏开发的潮流

相关文章:

JavaScript:游戏开发的利器

在近年来的科技迅速发展中,JavaScript 已逐渐成为游戏开发领域中最受欢迎的编程语言之一。它的跨平台特性、广泛的社区支持、丰富的库和框架使得开发者能够快速、有效地创建各种类型的游戏。本文将深入探讨 JavaScript 在游戏开发中的优势。 一、跨平台支持 JavaSc…...

C语言今天开始了学习

好多年没有弄了,还是捡起来弄下吧 用的vscode 建议大家参考这个配置 c语言vscode配置 c语言这个语言简单,但是今天听到了一个消息说python 不知道怎么debug。人才真多啊...

Elasticsearch 系列专题 - 第五篇:集群与性能优化

随着数据量和访问量的增长,单节点 Elasticsearch 已无法满足需求。本篇将介绍集群架构、性能优化方法以及常见故障排查,帮助你应对生产环境中的挑战。 1. 集群架构 1.1 节点角色(Master、Data、Ingest 等) Elasticsearch 集群由多个节点组成,每个节点可扮演不同角色: M…...

鸿蒙NEXT开发Preferences工具类(ArkTs)

import { AppUtil } from ./AppUtil; import dataPreferences from ohos.data.preferences; export const DEFAULT_PREFERENCE_NAME: string "SP_HARMONY_UTILS_PREFERENCES"; // Preferences实例的名称。/*** Preferences工具类* author CSDN-鸿蒙布道师* since 20…...

电商素材革命:影刀RPA魔法指令3.0驱动批量去水印,实现秒级素材净化

本文 去除水印实操视频展示电商图片水印处理的困境​影刀 RPA 魔法指令 3.0 强势登场​利用魔法指令3.0两步实现去除水印操作关于影刀RPA 去除水印实操视频展示 我们这里选择了4张小红书里面比较帅气的图片,但凡用过小红书的都知道,小红书右下角是会有小…...

前端面试题(七):什么是vuex,请解释一下它在Vue中的作用

Vuex 是一个专门为 Vue.js 应用程序开发的状态管理库。它可以集中管理应用的所有状态,并保证状态以一种可预测的方式发生变化。简单来说,Vuex 用来管理 Vue 应用中的数据(即状态),使得数据的传递和共享更加清晰和可靠&…...

笔记:头文件与静态库的使用及组织方式

笔记:头文件与静态库的使用及组织方式 1. 头文件的作用 接口声明:提供函数、类、变量等标识符的声明,供其他模块调用。编译依赖:编译器需要头文件来验证函数调用和类型匹配。避免重复定义:通过包含保护(如…...

ubuntu,react的学习(1)

在此目录下,开启命令行 /home/kt/react 如下操作 tkt4028:~/react$ npm create vitelatest task-manager -- --template react Need to install the following packages: create-vite6.3.1 Ok to proceed? (y) y> npx > cva task-manager --template react…...

【QT】QTreeWidgetItem的checkState/setCheckState函数和isSelected/setSelected函数

目录 1、函数原型1.1 checkState/setCheckState1.2 isSelected/setSelected2、功能用途3、示例QTreeWidget的checkState/setCheckState函数和isSelected/setSelected这两组函数有着不同的用途,下面具体说明: 1、函数原型 1.1 checkState/setCheckState Qt::CheckState QTr…...

CompletableFuture 和 List<CompletableFuture> allOf() join() get() 使用经验

CompletableFuture<Map<Menu, Map<IntentDetail, Double>>> xxx CompletableFuture.supplyAsync(() -> {Map<Menu, Map<IntentDetail, Double>> scores new ConcurrentHashMap<>();// 存储结果scores.computeIfAbsent(menu, k -> n…...

CExercise_09_结构体和枚举_2VS的Debug模式查看它的内存布局,采用结构体数组的方式存储信息,调用函数打印结构体数组.

题目&#xff1a; 下面结构体类型的变量的内存布局是怎样的&#xff1f;请使用VS的Debug模式查看它的内存布局 typedef struct stundent_s {int number;char name[25];char gender;int chinese;int math;int english; } Student;// 结构体对象的声明和初始化 Student s1 { 1, …...

SSRF漏洞技术解析与实战防御指南

一、SSRF漏洞简介 服务端请求伪造&#xff08;Server-Side Request Forgery, SSRF&#xff09; 是一种攻击者通过操控服务端发起非预期网络请求的安全漏洞。攻击者利用目标服务器的权限&#xff0c;构造恶意请求访问内网资源、本地系统文件或第三方服务&#xff0c;可能导致…...

CVA6:支持 Linux 的 RISC-V CPU CORE-V

RISC-V 是一种开源的可扩展指令集架构 (ISA)&#xff0c;在过去几年中广受欢迎。RISC-V 的主要特性之一是它采用整体架构中性设计&#xff0c;支持浮点运算、加载存储架构、符号扩展加速和多路复用器简化。这使得 RISC-V 成为 FPGA 上软处理器的经济实惠的选择。自 RISC-V ISA …...

水文-用 Coze 工作流打造你的自媒体写作工厂

零代码水文神器&#xff1a;用 Coze 工作流打造你的自媒体写作工厂 作为一个每天被 KPI 追着跑的自媒体运营人&#xff0c;你是不是也常常在想&#xff1a; “这篇文章换个标题就能发第二遍&#xff0c;能不能自动来&#xff1f;” 现在&#xff0c;用 Coze 工作流&#xff0c…...

轻奢宅家|约克VRF带你畅享舒适居家体验

下班回到家最期待什么&#xff1f;当然是一阵阵沁人心脾的舒适感扑面而来啦&#xff01;      想要从头到脚都舒服自在&#xff1f;答案就在眼前——就是它&#xff01;约克VRF中央空调&#xff01;      约克VRF中央空调独特的臻静降噪技术&#xff0c;让空调运行音轻…...

uniapp微信小程序图片生成水印

整体思路&#xff1a; 用户通过uni.chooseImage选择图片后&#xff0c;获得图片文件的path和size。通过path调用uni.getImageInfo获取图片信息&#xff0c;也就是图片宽高。图片宽高等比缩放至指定大小&#xff0c;不然手机处理起来非常久&#xff0c;因为手机随便拍拍就很大。…...

不用额外下载jar包,idea快速查看使用的组件源码

以nacos为例子&#xff0c;在idea中引入了nacos依赖&#xff0c;就可以查看源码了。 2. idea选择open&#xff08;不关闭项目直接选择file-open也可以&#xff09;, 在maven的仓库里找到对应的包&#xff0c;打开 2.idea中选择 jar包&#xff0c;选择 add as library 3.这样j…...

网络层-IP地址计算

例1&#xff1a;IP地址二进制与十进制互转 题目&#xff1a; 将二进制IP 11000000.10101000.00000001.00001010 转换为点分十进制。将IP地址 172.16.254.1 转换为二进制格式。 答案与解析&#xff1a; 转换步骤&#xff1a; 每个8位二进制转为十进制&#xff1a; 11000000 →…...

网络通讯协议UDP转发TCP工具_UdpToTcpRelay_双向版

UDP/TCP网络转发器程序说明书 1. 程序概述 本程序是一个高性能网络数据转发工具&#xff0c;支持UDP和TCP协议之间的双向数据转发&#xff0c;并具备以下核心功能&#xff1a; 协议转换&#xff1a;实现UDP↔TCP协议转换数据转换&#xff1a;支持十六进制/ASCII格式的数据转…...

DIA——边缘检测

1.边缘 边缘是像素的突变位置。 2.常见边缘检测算法 通过找到一阶导数的极值点或者二阶导数的过零点来确定边缘像素的位置。边缘检测通常使用算子&#xff0c;即特定的卷积核。通过差分对离散的像素点求导&#xff0c;然后转化成卷积核进行卷积。使用卷积统一涵盖求导&…...

【万象论坛】论坛系统测试报告

一、项目背景 1.1项目起因 在当今数字化浪潮下&#xff0c;互联网技术呈爆发式发展&#xff0c;新技术、新框架、新应用场景不断涌现。从大型企业的数字化转型到初创公司的技术创新&#xff0c;各个层面都离不开互联网技术的支撑。然而&#xff0c;技术人员在学习与工作过程中…...

【AI工具】FastGPT:开启高效智能问答新征程

前言 在人工智能飞速发展的当下&#xff0c;各类 AI 工具如雨后春笋般涌现。FastGPT 作为一款基于大语言模型&#xff08;LLM&#xff09;的知识图谱问答系统&#xff0c;凭借其强大的数据处理和模型调校能力&#xff0c;为用户带来了便捷的使用体验。今天&#xff0c;就让我们…...

华为数字芯片机考2025合集1已校正

单选 1&#xff0e;以下低功耗措施中&#xff0c;哪种不是降低电路翻转率的方法? A.在不进行算术运算的时候&#xff0c;使这些模块的输入保持不变&#xff0c;不让新的操作数进来 B.采用Gray 码或One‐hot 码作为状态机编码 C.减少电路中的glitch D.重新安排“if‐else”表达…...

【TS学习】(23)理解类的双重角色

在 TypeScript 中&#xff0c;类&#xff08;class&#xff09;不仅是一个运行时的值&#xff08;即可以实例化对象的构造函数&#xff09;&#xff0c;同时也是一个类型声明。具体来说&#xff0c;类在 TypeScript 中既声明了值&#xff0c;也声明了类型&#xff0c;并且它的类…...

多模态大模型在目标检测领域的最新进展

1. 技术融合创新 多模态数据融合&#xff1a; 传感器融合&#xff1a;整合图像、激光雷达&#xff08;LiDAR&#xff09;、毫米波雷达等数据&#xff0c;提升检测精度和鲁棒性。例如&#xff0c;在自动驾驶中&#xff0c;通过融合视觉与LiDAR数据&#xff0c;实现三维目标检测…...

HackMyVM - todd记录

HackMyVM - toddhttps://mp.weixin.qq.com/s/E_-hepdfY-0veilL1fl2QA...

bash脚本手动清空mysql表数据

文章目录 1、bash脚本手动清空mysql表数据 1、bash脚本手动清空mysql表数据 #!/bin/bash# 配置区域&#xff08;修改此处&#xff09; MYSQL_USER"root" MYSQL_PASSWORD"123456" MYSQL_HOST"localhost" DATABASES("hps-base:base_test_ite…...

【完整可用】使用openhtmltopdf生成PDF(带SVG)

文章目录 前言OpenHTMLToPDF 简介maven配置依赖字体文件demo代码其他资源放置截图防止maven编译字体文件 前言 AI和网上都是跑不起来或者版本过低的&#xff0c;还有各种BUG的。本文都是查阅官方文档得出的。如果你能跑起来请给个大大的赞&#xff01; OpenHTMLToPDF 简介 Ope…...

CTF web入门之爆破

爆破 web21: 打开burp进行抓包 通过对密码进行解析。得知密码是由拼接而来 admin:1 选择要攻击的参数 攻击方式。 选择payload方式 。。添加参数 1&#xff0c;2&#xff0c;3。账号 分隔符 密码 选择加密方式。添加buse64.去掉url字符。不然buse64后&#xff0c;会在u…...

Java学习——day26(线程同步与共享资源保护)

文章目录 1. 线程同步与共享资源保护概述1.1 多线程安全问题1.2 解决方案&#xff1a;线程同步 2. 线程同步的常用方式2.1 使用 synchronized 关键字2.2 使用 ReentrantLock 3. 实践&#xff1a;多线程计数器示例4. 实践说明与运行步骤5. 总结与思考6.今日生词 1. 线程同步与共…...