Saya sedang mengerjakan server permainan generik yang mengelola permainan untuk sejumlah klien jaringan soket TCP yang sewenang-wenang yang memainkan permainan. Saya memiliki 'desain' diretas bersama dengan lakban yang berfungsi, tetapi tampaknya rapuh dan tidak fleksibel. Apakah ada pola mapan untuk bagaimana menulis komunikasi klien / server yang kuat dan fleksibel? (Jika tidak, bagaimana Anda meningkatkan apa yang saya miliki di bawah ini?)
Kira-kira saya punya ini:
- Saat menyiapkan permainan, server memiliki satu utas untuk setiap soket pemain yang menangani permintaan sinkron dari klien dan respons dari server.
- Namun, begitu permainan berjalan, semua utas kecuali untuk satu tidur, dan utas tersebut berputar melalui semua pemain satu per satu untuk berkomunikasi tentang gerakan mereka (dalam permintaan-tanggapan terbalik).
Berikut diagram dari apa yang saya miliki saat ini; klik untuk versi yang lebih besar / dapat dibaca, atau 66kB PDF .
Masalah:
- Ini membutuhkan pemain untuk merespons secara bergiliran dengan pesan yang tepat. (Saya kira saya bisa membiarkan setiap pemain merespons dengan omong kosong acak dan hanya bergerak begitu mereka memberi saya langkah yang valid.)
- Itu tidak memungkinkan pemain untuk berbicara ke server kecuali jika giliran mereka. (Saya dapat meminta server mengirim pembaruan tentang pemain lain kepada mereka, tetapi tidak memproses permintaan yang tidak sinkron.)
Persyaratan akhir:
Kinerja bukan yang terpenting. Ini sebagian besar akan digunakan untuk game non-realtime, dan sebagian besar untuk mengadu AI satu sama lain, bukan manusia yang gelisah.
Permainan akan selalu berbasis giliran (bahkan jika pada resolusi yang sangat tinggi). Setiap pemain selalu mendapat satu gerakan diproses sebelum semua pemain lain mendapat giliran.
Implementasi server kebetulan berada di Ruby, jika itu membuat perbedaan.