# เซิร์ฟเวอร์เกมเรียลไทม์บน PlayDrop: Colyseus และ MongoDB

รันเซิร์ฟเวอร์ Colyseus 0.17 ที่โฮสต์ให้พร้อมฐานข้อมูล MongoDB สำหรับเกมของคุณ เชื่อมต่อจากเบราว์เซอร์ด้วย SDK ทดสอบด้วยผู้เล่นสองคน และรู้ขีดจำกัด

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

PlayDrop โฮสต์ฝั่งเซิร์ฟเวอร์ของเกมคุณได้: เซิร์ฟเวอร์ Colyseus มาตรฐานพร้อมฐานข้อมูล MongoDB ของตัวเอง ผู้เล่นที่ยืนยันตัวตนแล้ว และไม่ต้องดูแลโครงสร้างพื้นฐานเอง ใช้สำหรับแมตช์แบบเรียลไทม์ เกมผลัดตา โลกที่ใช้ร่วมกัน และทุกอย่างที่ผู้เล่นต้องโกงไม่ได้ เซิร์ฟเวอร์ไม่บังคับ เกมของคุณเรียกเซิร์ฟเวอร์ที่คุณโฮสต์เองก็ได้

## เขียนเซิร์ฟเวอร์

ส่งออกแมป `rooms` จากโมดูล ES หนึ่งโมดูล PlayDrop เป็นผู้เริ่มเซิร์ฟเวอร์ อย่าเรียก `listen()` หรือกำหนด `onAuth` เพราะ PlayDrop ยืนยันตัวตนผู้เล่นแต่ละคนก่อน `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) };
```

เชื่อมต่อ MongoDB ภายในวงจรชีวิตของห้อง ห้ามเชื่อมต่อที่ระดับโมดูลเด็ดขาด: `PLAYDROP_MONGO_URL` มีอยู่เฉพาะตอนรันเท่านั้น สร้างดัชนีสำหรับคิวรีของคุณ

## ประกาศเซิร์ฟเวอร์

รวมเซิร์ฟเวอร์เป็นไฟล์เดียวแล้วชี้แคตตาล็อกไปที่ไฟล์นั้น:

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

อัปโหลดใน[แพ็กเกจ](https://www.playdrop.ai/th/create/learn/packaging) เส้นทาง HTML แบบง่ายใส่เซิร์ฟเวอร์ไม่ได้

## กฎของรันไทม์ที่โฮสต์ให้

- Colyseus 0.17 (`colyseus` 0.17.10, `@colyseus/schema` 4.0.30) ไดรเวอร์ MongoDB 7.5 บน Node.js 24.22.1
- โมดูล ES ที่ครบในตัวหนึ่งไฟล์ ขนาดไม่เกิน 2 MiB นำเข้าได้เฉพาะ `colyseus`, `@colyseus/core`, `@colyseus/schema`, `mongodb` และ `@playdrop/server` ส่วนอื่นทั้งหมดต้องรวมไว้ในไฟล์
- ไม่เกิน 2 ประเภทห้อง 8 ผู้เล่นต่อห้อง 4 ชั่วโมงต่อห้อง 30 ข้อความต่อวินาทีต่อผู้เล่น และ 512 KiB ต่อข้อความ
- เข้าถึงอินเทอร์เน็ตไม่ได้: เข้าถึงได้เฉพาะ MongoDB และบริการของ PlayDrop
- ผู้เล่นต้องเข้าสู่ระบบ
- ฐานข้อมูลหนึ่งชุดต่อเกม เก็บข้ามเวอร์ชันและนับรวมในพื้นที่จัดเก็บของครีเอเตอร์ ห้ามส่งที่อยู่หรือข้อมูลรับรองของฐานข้อมูลไปยังเบราว์เซอร์เด็ดขาด

## เชื่อมต่อจากเบราว์เซอร์

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

`join` จัดการที่นั่งในปาร์ตี้และการเข้าสู่ระบบของ PlayDrop ให้ ดู[ปาร์ตี้ออนไลน์](https://www.playdrop.ai/th/create/learn/online-party) หากต้องการควบคุมในระดับล่างกว่า `sdk.multiplayer.getConnection()` จะส่งคืน `{ endpoint, token, expiresAt }` สำหรับไคลเอนต์ Colyseus อย่างเป็นทางการจาก `sdk.libs.colyseus.load()`

## SDK ฝั่งเซิร์ฟเวอร์

`@playdrop/server` เพิ่มการเรียกแพลตฟอร์มที่เชื่อถือได้: เพื่อนและการ์ดเกม (`playdrop.social`) การยืนยันการซื้อ (`playdrop.shop`) การสร้างด้วย AI โดยครีเอเตอร์เป็นผู้จ่าย (`playdrop.ai`) และแชทเสียงในห้อง (`playdrop.multiplayer.forRoom`) การเรียกเหล่านี้ใช้ได้เฉพาะกับเกมที่อัปโหลดแล้ว ดู[เอกสารอ้างอิง SDK ฝั่งเซิร์ฟเวอร์](https://www.playdrop.ai/th/create/learn/server-sdk)

## ทดสอบ

ระหว่างพัฒนา ให้รัน Colyseus 0.17 และ MongoDB ในเครื่อง แล้วเชื่อมต่อไคลเอนต์ในเครื่องกับเซิร์ฟเวอร์ในเครื่อง หากต้องการทดสอบเซิร์ฟเวอร์ที่โฮสต์ ให้อัปโหลดเวอร์ชันส่วนตัวแล้วเปิด `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1` จากนั้นเปิดลิงก์เดียวกันที่ใช้ `player=2` ในหน้าต่างที่สอง แต่ละหน้าต่างเล่นเป็นผู้เล่นทดสอบของคุณแยกกัน เมื่อใช้งานได้แล้ว เผยแพร่เวอร์ชันที่ทดสอบด้วย `publish_game_version`

ออกแบบให้รับมือกับการหลุดการเชื่อมต่อ: การเชื่อมต่อใหม่ของ Colyseus จะกันที่นั่งไว้ช่วงสั้นๆ และสถานะของห้องควรให้ผู้เล่นที่กลับมาเล่นต่อได้

## คู่มือที่เกี่ยวข้อง

- [ปาร์ตี้ออนไลน์และแชทเสียง](https://www.playdrop.ai/th/create/learn/online-party): ให้เพื่อนเล่นด้วยกันออนไลน์: ประกาศขนาดปาร์ตี้ เปิดหน้าต่างปาร์ตี้ของ PlayDrop เข้าห้องที่จองไว้ด้วย sdk.multiplayer.join และควบคุมแชทเสียงในห้อง
- [SDK ฝั่งเซิร์ฟเวอร์](https://www.playdrop.ai/th/create/learn/server-sdk): เอกสารอ้างอิงเซิร์ฟเวอร์เกมที่ PlayDrop โฮสต์ให้: กฎของรันไทม์ PlayDropPlayer ที่ยืนยันแล้ว และ API เซิร์ฟเวอร์ social, shop, ai และ multiplayer
- [การจัดแพ็กเกจและ .play](https://www.playdrop.ai/th/create/learn/packaging): จัดโฟลเดอร์เกมที่บิลด์แล้ว ZIP หรือ .play ให้มี catalogue.json ที่ราก ประกาศสื่อของหน้าเกมและเซิร์ฟเวอร์ แล้วอัปโหลดด้วย prepare_catalogue_upload
