# Máy chủ game thời gian thực trên PlayDrop: Colyseus và MongoDB

Chạy máy chủ Colyseus 0.17 được lưu trữ kèm cơ sở dữ liệu MongoDB cho game, kết nối từ trình duyệt bằng SDK, thử với hai người chơi và nắm rõ giới hạn.

Source: https://www.playdrop.ai/vi/create/learn/game-servers

PlayDrop có thể lưu trữ phần máy chủ của game bạn: một máy chủ Colyseus chuẩn với cơ sở dữ liệu MongoDB riêng, người chơi đã được xác minh và không có hạ tầng nào bạn phải vận hành. Hãy dùng nó cho các trận đấu thời gian thực, game theo lượt, thế giới dùng chung và mọi thứ mà người chơi không được phép gian lận. Máy chủ là tùy chọn; game của bạn cũng có thể gọi một máy chủ do bạn tự lưu trữ.

## Viết máy chủ

Export một đối tượng ánh xạ `rooms` từ một module ES. PlayDrop khởi động máy chủ; đừng gọi `listen()` hay định nghĩa `onAuth`, vì PlayDrop xác minh từng người chơi trước `onJoin`.

```js
import { Room, defineRoom } from "colyseus";
import { MongoClient } from "mongodb";

class GameRoom extends Room {
  maxClients = 8;
  async onCreate() {
    this.mongo = new MongoClient(process.env.PLAYDROP_MONGO_URL);
    await this.mongo.connect();
    this.onMessage("move", (client, move) => this.applyMove(client.auth.userId, move));
  }
  onJoin(client) {
    // client.auth is the verified PlayDrop player: userId, username, appRole, isTestPlayer…
  }
  async onDispose() { await this.mongo?.close(); }
}

export const rooms = { game: defineRoom(GameRoom) };
```

Kết nối tới MongoDB bên trong vòng đời của phòng, không bao giờ ở phạm vi module: `PLAYDROP_MONGO_URL` chỉ tồn tại lúc chạy. Hãy tạo chỉ mục cho các truy vấn của bạn.

## Khai báo máy chủ

Gộp máy chủ vào một tệp và trỏ catalogue tới tệp đó:

```json
{ "server": { "entry": "server/index.mjs", "rooms": ["game"] } }
```

Tải nó lên trong một [gói](https://www.playdrop.ai/vi/create/learn/packaging); cách tải HTML đơn giản không mang theo được máy chủ.

## Quy tắc của môi trường chạy do PlayDrop vận hành

- Colyseus 0.17 (`colyseus` 0.17.10, `@colyseus/schema` 4.0.30), driver MongoDB 7.5, trên Node.js 24.22.1.
- Một module ES khép kín tối đa 2 MiB. Nó chỉ được import `colyseus`, `@colyseus/core`, `@colyseus/schema`, `mongodb` và `@playdrop/server`; hãy gộp mọi thứ khác vào tệp.
- Tối đa 2 loại phòng, 8 người chơi mỗi phòng, 4 giờ mỗi phòng, 30 tin nhắn mỗi giây cho mỗi người chơi và 512 KiB mỗi tin nhắn.
- Không có truy cập internet: chỉ có thể truy cập MongoDB và các dịch vụ của PlayDrop.
- Người chơi phải đăng nhập.
- Một cơ sở dữ liệu cho mỗi game, được giữ qua các phiên bản và tính vào dung lượng của nhà sáng tạo. Không bao giờ gửi địa chỉ hay thông tin xác thực của nó đến trình duyệt.

## Kết nối từ trình duyệt

```js
const sdk = await playdrop.init();
const room = await sdk.multiplayer.join("game");
room.onStateChange((state) => render(state));
room.send("move", { x: 1 });
```

`join` xử lý chỗ ngồi của nhóm chơi PlayDrop và việc đăng nhập; xem [nhóm chơi trực tuyến](https://www.playdrop.ai/vi/create/learn/online-party). Để kiểm soát ở mức thấp hơn, `sdk.multiplayer.getConnection()` trả về `{ endpoint, token, expiresAt }` cho client Colyseus chính thức lấy từ `sdk.libs.colyseus.load()`.

## SDK server

`@playdrop/server` thêm các lệnh gọi nền tảng đáng tin cậy: bạn bè và thẻ game (`playdrop.social`), xác minh giao dịch mua (`playdrop.shop`), tạo nội dung bằng AI do nhà sáng tạo trả phí (`playdrop.ai`) và thoại phòng (`playdrop.multiplayer.forRoom`). Chúng chỉ chạy trên game đã tải lên. Xem [tài liệu tham khảo SDK server](https://www.playdrop.ai/vi/create/learn/server-sdk).

## Thử nghiệm

Trong lúc phát triển, hãy chạy Colyseus 0.17 và MongoDB cục bộ và kết nối client cục bộ tới máy chủ cục bộ của bạn. Để thử máy chủ được lưu trữ, hãy tải lên một phiên bản riêng tư và mở `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1`, rồi mở cùng liên kết đó với `player=2` trong cửa sổ thứ hai. Mỗi cửa sổ chơi như một người chơi thử riêng của bạn. Khi mọi thứ hoạt động, hãy xuất bản phiên bản đã thử bằng `publish_game_version`.

Hãy thiết kế cho trường hợp mất kết nối: cơ chế kết nối lại của Colyseus giữ chỗ trong một thời gian ngắn, và trạng thái của phòng nên cho phép người chơi quay lại tiếp tục chơi.

## Hướng dẫn liên quan

- [Nhóm chơi trực tuyến và thoại](https://www.playdrop.ai/vi/create/learn/online-party): Cho bạn bè chơi cùng nhau trực tuyến: khai báo quy mô nhóm chơi, mở cửa sổ nhóm chơi của PlayDrop, vào phòng đã giữ chỗ bằng sdk.multiplayer.join, điều khiển thoại phòng.
- [SDK server](https://www.playdrop.ai/vi/create/learn/server-sdk): Tài liệu tham khảo máy chủ game do PlayDrop lưu trữ: quy tắc môi trường chạy, PlayDropPlayer đã xác minh, và các API máy chủ social, shop, ai, multiplayer.
- [Đóng gói và .play](https://www.playdrop.ai/vi/create/learn/packaging): Sắp xếp thư mục game đã dựng, tệp ZIP hoặc .play có catalogue.json ở thư mục gốc, khai báo media giới thiệu, máy chủ, rồi tải lên bằng prepare_catalogue_upload.
