Node.js游戏服务器项目移植-1:项目移植版本环境的冲突问题以及技术选型测试

正在移植一个node-cocos的棋牌项目,需求是从8移植到24。在window10系统下用nvm下载8.9.1这个版本,nvm提示下载失败强行终止,所以只能手动配置。如何下载使用nvm请去看nest.js系列第二节里有,这里不做复述。

一、手动下载 Node.js 8.9.1(不要通过 nvm 自动下)

  1. 打开这个地址: https://npmmirror.com/mirrors/node/v8.9.1/

  2. 下载:node-v8.9.1-win-x64.zip(不要下msi包,之下压缩包)

  3. 解压到你 nvm 的目录,一般是:

    C:\Users\your name\AppData\Local\nvm\v8.9.1\

    (要保证v8.9.1里面直接就是 node.exe,不是再套一层文件夹)

v8.9.1直接就带npm5.5.1,直接就可以使用。

这个版本只是运行老项目用,开发新项目需要使用v24.15.0

在24的环境下,把npm源设置为国内的镜像

bash 复制代码
# 设为淘宝新域名(旧 registry.npm.taobao.org 已失效)
npm config set registry https://registry.npmmirror.com

# 查看是否生效
npm config get registry

创建项目文件夹,在文件夹中执行

npm init

技术选型使用express或者colyseus哪一个还没有定,这里先简介一下

二、Colyseus简介

Colyseus 是 "基于 WebSocket 的多人游戏框架"。

  • colyseus.js(客户端) :底层就是 WebSocket,用来连 Colyseus 服务器。
  • Colyseus 服务器 :默认用 ws 库做 WebSocket 传输,也可以换成更快的 uWebSockets.jsColyseus。
  • 整个框架核心就是 WebSocket + 房间 + 状态同步。

1. 它和 "纯 ws" 区别

  • 纯 ws:你要自己写
    • 连接管理
    • 房间 / 玩家匹配
    • 状态同步、广播
    • 心跳、断线重连
  • Colyseus:帮你把这些都封装好了,但底层仍然是 WebSocket。

2. 最小示例(服务器 + 客户端)

服务器(Node.js)

bash

运行

复制代码
npm init -y
npm install colyseus

js

复制代码
// index.js
const { Server } = require("colyseus");

const gameServer = new Server();

// 定义一个房间
gameServer.define("my_room", class MyRoom extends Schema {
  onJoin(client) {
    console.log("玩家加入");
    client.send("hello", "欢迎!");
  }
  onMessage(client, data) {
    console.log("收到:", data);
    this.broadcast(data); // 广播给所有人
  }
});

gameServer.listen(3000);
console.log("Colyseus 服务器运行在 3000 端口");
客户端(浏览器 /colyseus.js)

html

预览

复制代码
<script src="https://unpkg.com/colyseus.js@^0.16.0/dist/colyseus.js"></script>
<script>
const client = new Colyseus.Client("ws://localhost:3000");
client.joinOrCreate("my_room").then(room => {
  console.log("进入房间");
  room.onMessage("hello", msg => console.log(msg));
  room.send("test", "来自客户端的消息");
});
</script>

三、Express和msgpack-lite

1. 在项目目录安装依赖(2 个包)

打开终端,进入你的项目文件夹,执行:

bash

运行

复制代码
npm install express msgpack-lite

2. 创建主文件:index.js

直接复制下面全部代码,保存为 index.js

javascript

运行

复制代码
const express = require('express');
const msgpack = require('msgpack-lite');

const app = express();
// 支持解析 JSON 入参
app.use(express.json());

// --------------------------
// 接口一:字符串 → msgpack 压缩 → 转 16 进制字符串
// --------------------------
app.get('/encode', (req, res) => {
  // 从 url 参数获取字符串,默认用测试字符串
  const str = req.query.str || 'hello 游戏服务器 123';

  // 1. 字符串转 msgpack 二进制
  const buffer = msgpack.encode(str);

  // 2. 二进制转 16 进制字符串
  const hexStr = buffer.toString('hex');

  // 返回结果
  res.json({
    original: str,
    hex: hexStr
  });
});

// --------------------------
// 接口二:输入 16 进制字符串 → 还原成正常字符串
// --------------------------
app.post('/decode', (req, res) => {
  const { hex } = req.body;

  if (!hex) {
    return res.status(400).json({ error: '请传入 hex 字段' });
  }

  try {
    // 1. 16进制 → 二进制 buffer
    const buffer = Buffer.from(hex, 'hex');

    // 2. 解包 msgpack → 原始字符串
    const result = msgpack.decode(buffer);

    res.json({
      hex: hex,
      decoded: result
    });
  } catch (err) {
    res.status(400).json({ error: '16进制格式错误,无法解码' });
  }
});

// 启动服务
const PORT = 3000;
app.listen(PORT, () => {
  console.log(`服务运行在 http://localhost:${PORT}`);
});

3. 启动服务

bash

运行

复制代码
node index.js

4. 两个接口使用方法

接口一(编码)

GET

plaintext

复制代码
http://localhost:3000/encode?str=我是测试字符串

返回:

json

复制代码
{
  "original": "我是测试字符串",
  "hex": "a5e68891e698afe6b58be8af95e5ad97e7aca6e4b8b2"
}
接口二(解码)

POST

plaintext

复制代码
http://localhost:3000/decode

Body(JSON):

json

复制代码
{
  "hex": "a5e68891e698afe6b58be8af95e5ad97e7aca6e4b8b2"
}

返回:

json

复制代码
{
  "hex": "a5e68891e698afe6b58be8af95e5ad97e7aca6e4b8b2",
  "decoded": "我是测试字符串"
}
相关推荐
揽星河..14 小时前
【C语言】扫雷游戏
c语言·算法·游戏
damoluomu15 小时前
Node 的 Headless 出厂没有前台,Java 的 Headless 是从门户里长出来的
java·开发语言·node.js
郝学胜-神的一滴16 小时前
AI 编程智能体 22:解析器赋能与实战落地全指南
人工智能·程序人生·游戏·unity·游戏引擎
Dumbness16 小时前
一个手机号验证码登录接口的五个坑:无限发码、无限试码,传个数字就让 Express 进程退出
node.js·express
云上工程笔记17 小时前
用 AstraWork 复刻并二创一款网页地牢游戏:从链接到上线的完整工程实践
游戏
怒放的生命199118 小时前
本地用 pnpm 省磁盘,团队继续用 npm:极简实践
前端·npm·node.js
zrc00700719 小时前
steam无法登录 steam错误 登录时出现错误。请稍后再试。解决办法 steam无法登录解决办法 湖南地区steam DNS问题解决办法
windows·经验分享·游戏·缓存·游戏程序·创业创新·玩游戏
大囚长21 小时前
Kubernetes 的资源开销、适用边界,以及游戏与有状态负载的工程现实
游戏·容器·kubernetes
qq_25294131681 天前
三角洲第一人称射击游戏(FPS)角色部位检测数据集 | 游戏目标检测、角色部位识别、小目标检测9296期
目标检测·游戏·计算机·目标跟踪·三角洲·三角洲游戏·身体
william_yangshun2 天前
【AI实战】Claude-Code-Game-Studios中文版使用教程:把Claude Code改造成49个Agent的游戏工作室
人工智能·游戏