Nodejs实时传输问题求解
Nodejs实时传输问题求解
我正在尝试搞一个web game,利用nodeJS进行即时传输实现多人实时游戏,但是我遇到了一个问题。
我的用户都是在我的一个php网站里面的,然后游戏也打算放在网站里面,那我该怎么把用户在游戏里面获得的金币或者物品的数据存档在php网站的MYsql数据库里面
PS:我的服务器是用apache,顺带我想问我这样的设计是不是很有问题,用户的社区在apache,游戏的主要逻辑运行和实时传输就交给nodeJS
当然可以!针对你的需求,我们可以设计一个系统,将用户在游戏中的操作(如获取金币或物品)实时同步到MySQL数据库中。以下是一个基本的设计方案:
设计概述
- 前端:使用HTML/CSS/JavaScript构建游戏界面。
- 后端:
- 使用PHP处理用户认证、登录等社区功能,并连接到MySQL数据库。
- 使用Node.js处理游戏逻辑和实时通信。
技术栈
- 前端:HTML, CSS, JavaScript (客户端)
- 后端:
- PHP:用于处理社区功能和与MySQL数据库交互。
- Node.js:用于处理游戏逻辑和实时通信(例如使用Socket.IO)。
示例代码
PHP端(连接MySQL)
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "game_db";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
function updatePlayerData($playerId, $gold, $items) {
global $conn;
$stmt = $conn->prepare("UPDATE players SET gold=?, items=? WHERE id=?");
$stmt->bind_param("sii", $gold, $items, $playerId);
$stmt->execute();
$stmt->close();
}
$conn->close();
?>
Node.js端(使用Socket.IO处理实时通信)
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
io.on('connection', (socket) => {
console.log('A user connected');
socket.on('updateGameData', (data) => {
const playerId = data.playerId;
const gold = data.gold;
const items = data.items;
// 调用PHP脚本更新数据
const exec = require('child_process').exec;
exec(`php update_player.php ${playerId} ${gold} '${JSON.stringify(items)}'`, (error, stdout, stderr) => {
if (error) {
console.error(`Error updating data: ${stderr}`);
return;
}
console.log(`Data updated: ${stdout}`);
});
// 发送确认消息给客户端
socket.emit('gameDataUpdated', { message: 'Game data has been updated successfully.' });
});
socket.on('disconnect', () => {
console.log('User disconnected');
});
});
server.listen(3000, () => {
console.log('Server is running on port 3000');
});
说明
- PHP部分:定义了一个函数
updatePlayerData
来更新玩家的数据(金币和物品)。该函数通过SQL语句更新数据库。 - Node.js部分:使用Socket.IO来处理客户端与服务器之间的实时通信。当客户端发送更新请求时,Node.js调用PHP脚本来更新数据库,并返回确认消息。
总结
这种设计是可行的,因为你可以将不同的职责分配给不同的技术栈。PHP处理社区功能和数据库交互,而Node.js处理实时通信和游戏逻辑。这种方式能够有效地分离关注点,提高系统的可维护性和扩展性。
可以尝试用socket.io: https://github.com/LearnBoost/socket.io做传输, 然后在服务器端用https://github.com/felixge/node-mysql读写数据库。
1、金币和物品放内存里,用户超时掉线或者退出的时候,写数据库,销毁内存。 2、没问题的。
对于你的问题,可以分为几个部分来解决:
-
将用户在游戏中的数据存储到MySQL数据库中:你可以创建一个API接口来实现这一功能。这个API可以用Node.js编写,通过HTTP请求接收来自游戏的数据,并将其存储到MySQL数据库中。
-
设计是否合理:你的设计思路是合理的。使用Node.js处理实时通信(如WebSocket)是很常见且高效的方式,而使用Apache和PHP处理静态内容和传统数据库操作也很常见。你可以让Node.js与PHP应用共存并协同工作。
示例代码
首先,你需要安装一些必要的库:
npm install express mysql ws
接着,创建一个简单的Node.js服务器来处理WebSocket连接,并将游戏数据存储到MySQL数据库中。
const express = require('express');
const mysql = require('mysql');
const WebSocket = require('ws');
const app = express();
const wss = new WebSocket.Server({ port: 8080 });
// 创建MySQL连接
const db = mysql.createConnection({
host: 'localhost',
user: 'yourusername',
password: 'yourpassword',
database: 'yourdatabase'
});
db.connect((err) => {
if (err) throw err;
console.log('Connected to the MySQL server.');
});
wss.on('connection', function connection(ws) {
ws.on('message', function incoming(message) {
const data = JSON.parse(message);
// 假设data包含用户ID和金币数量
const userId = data.userId;
const goldAmount = data.goldAmount;
// 将数据插入到MySQL数据库
const sql = 'INSERT INTO player_data (userId, goldAmount) VALUES (?, ?)';
db.query(sql, [userId, goldAmount], (error, results, fields) => {
if (error) throw error;
console.log('Data saved:', data);
});
});
});
app.listen(3000, () => {
console.log('Express server listening on port 3000');
});
说明
- WebSocket:我们使用WebSocket来进行实时通信。
- MySQL:我们将游戏数据保存到MySQL数据库中。确保你已经有一个名为
player_data
的表来存储这些信息。 - Express:使用Express框架来启动HTTP服务器。
通过这种方式,你可以实现实时的游戏数据更新,并将这些数据保存到MySQL数据库中。这样既保证了游戏的实时性,又能确保玩家数据被正确地持久化存储。