Apa yang terlibat dengan penulisan server lobi?

8

Jadi saya sedang menulis sistem perjodohan Catur berdasarkan pada tampilan Lobi dengan ruang permainan, obrolan umum dll. Sejauh ini saya memiliki prototipe yang berfungsi tetapi saya memiliki keraguan besar mengenai beberapa hal yang saya lakukan dengan server. Menulis server lobi permainan adalah pengalaman pemrograman baru bagi saya, jadi saya tidak memiliki model pemrograman yang jelas atau tepat untuk itu. Saya juga tidak dapat menemukan kertas yang menjelaskan bagaimana seharusnya bekerja. Saya memesan "Java Network Programming 3rd edition" dari Amazon dan masih menunggu pengiriman, mudah-mudahan saya akan menemukan beberapa contoh / informasi yang berguna dalam buku ini.

Sementara itu, saya ingin mengumpulkan pendapat Anda dan melihat bagaimana Anda akan menangani beberapa hal sehingga saya bisa belajar cara menulis server dengan benar. Berikut adalah beberapa pertanyaan dari kepala saya: (mungkin lebih banyak akan datang)

Pertama, mari kita tentukan apa yang dilakukan server. Fungsionalitas utamanya adalah untuk memegang koneksi TCP dengan klien, mendengarkan acara yang mereka hasilkan, dan mengirimkannya ke pemain lain. Tetapi apakah ada yang lebih dari itu?

Haruskah saya menggunakan satu utas per klien? Jika demikian, 300 klien = 300 utas. Bukankah itu terlalu berlebihan? Perangkat keras apa yang diperlukan untuk mendukungnya? Dan berapa banyak bandwidth yang dikonsumsi lobi maka kira-kira?

Jenis struktur data apa yang harus digunakan untuk memegang soket klien? Bagaimana Anda melindunginya dari modifikasi bersamaan (mis. Seorang pemain masuk atau ada lobi) ketika iterasi melalui itu untuk mengirim acara tanpa mengganggu throughput? Apakah ConcurrentHashMap jawaban yang benar di sini, atau ada beberapa teknik yang harus saya ketahui?

Ketika pengguna memasuki lobi, mekanisme apa yang akan Anda gunakan untuk mentransfer keadaan lobi kepadanya? Dan sementara ini terjadi, di mana peristiwa-peristiwa lainnya muncul?

Kira
sumber
300 utas ok pada OS modern, di lebih dari 1000 Anda mungkin ingin memeriksa sistem lain seperti yang tidak terhubung.
Valmond

Jawaban:

3

Model segala sesuatu sebagai objek. Anda memiliki ruang obrolan kelas, sesi permainan, pemain ... Jangan menelurkan utas baru untuk pemain baru. Alih-alih mencoba melihat setiap kelas sebagai mesin negara: Seorang pemain dapat terhubung atau terputus, ia memiliki TcpConnection dan variabel yang menentukan berapa banyak waktu yang tersisa untuk melakukan gerakannya (seperti contoh).

Kemudian ketika Anda memiliki semua objek Anda dalam array atau sesuatu seperti itu, Anda mengulanginya setiap 10 milidetik (angka tersebut adalah contoh terlalu ofcourse) dan mengambil tindakan yang tepat.

Misalnya, hentikan sesi permainan jika salah satu pemain meninggalkan permainan, kirim gerakan dari satu pemain ke pemain lain ...

Untuk semua peristiwa yang terjadi dalam gim Anda harus mengirim pesan melalui jaringan. Buat satu kelas tambahan / enumerasi yang menampung berbagai jenis pesan. Jika satu pemain bergerak, Anda dapat mengirim ini ke server "pindahkan d4 ke d5" atau apalah. Jika Anda hanya membuat permainan catur, Anda dapat mengirim string melalui jaringan. Untuk hal yang lebih kompleks, saya sarankan Anda hanya mengirim satu byte.

Paket permainan biasanya terdiri dari: panjang paket, jenis pesan paket / jenis acara (bergerak, pemain-bergabung, pemain-kiri, ...) dan konten (jika pemain bergabung, konten akan menjadi nama untuk contoh)

Riki
sumber