Cosa comporta scrivere un server di lobby?


8

Quindi sto scrivendo un sistema di matchmaking degli scacchi basato su una vista Lobby con sale da gioco, chat generale ecc. Finora ho un prototipo funzionante ma ho grandi dubbi su alcune cose che ho fatto con il server. Scrivere un server della lobby di gioco è per me una nuova esperienza di programmazione e quindi non ho un modello di programmazione chiaro né preciso. Inoltre non sono riuscito a trovare un documento che descriva come dovrebbe funzionare. Ho ordinato "Java Network Programming 3rd edition" da Amazon e sto ancora aspettando la spedizione, spero di trovare alcuni esempi / informazioni utili in questo libro.

Nel frattempo, vorrei raccogliere le tue opinioni e vedere come gestiresti alcune cose in modo da poter imparare a scrivere un server correttamente. Qui ci sono alcune domande dalla parte superiore della mia testa: (potrebbe essere più arriverà)

Innanzitutto, definiamo cosa fa un server. La sua funzionalità principale è quella di mantenere le connessioni TCP con i client, ascoltare gli eventi che generano e inviarli agli altri giocatori. Ma c'è di più?

Dovrei usare un thread per client? In tal caso, 300 client = 300 thread. Non è troppo? Quale hardware è necessario per supportarlo? E quanta larghezza di banda consuma allora una lobby?

Che tipo di struttura di dati dovrebbe essere utilizzata per contenere i socket dei client? Come proteggerlo da modifiche simultanee (es. Un giocatore entra o esiste nella lobby) quando scorre attraverso di esso per inviare un evento senza compromettere il rendimento? ConcurrentHashMap è la risposta corretta qui o ci sono alcune tecniche che dovrei conoscere?

Quando un utente entra nella lobby, quale meccanismo useresti per trasferire a lui lo stato della lobby? E mentre ciò accade, da dove vengono gli altri eventi?


300 thread è ok su un sistema operativo moderno, a oltre 1000 potresti voler controllare altri sistemi come uno non connesso.
Valmond,

Risposte:


3

Modella tutto come oggetti. Hai le classi chat room, game-session, player ... Non generare nuove discussioni per i nuovi giocatori. Prova invece a vedere ogni classe come una macchina a stati: un giocatore può essere connesso o disconnesso, ha un TcpConnection e una variabile che specifica quanto tempo gli rimane per fare la sua mossa (solo come esempio).

Quindi, quando hai tutti i tuoi oggetti in un array o qualcosa del genere, esegui l'iterazione ogni 10 millisecondi (il numero è un esempio troppo spesso) e intraprendi le azioni appropriate.

Ad esempio, termina una sessione di gioco se uno dei giocatori ha lasciato il gioco, invia mosse da un giocatore all'altro ...

Per tutti gli eventi che si verificano nel gioco dovrai inviare messaggi attraverso la rete. Creare una classe / enumerazione aggiuntiva che contiene i diversi tipi di messaggio. Se un giocatore fa una mossa, puoi inviarla al server "sposta d4 in d5" o qualcosa del genere. Se fai solo una partita a scacchi, puoi inviare stringhe attraverso la rete. Per qualcosa di più complesso suggerirei di inviare solo singoli byte.

Tipicamente i pacchetti di gioco consistono in: la lunghezza del pacchetto, il tipo di messaggio pacchetto / tipo di evento (mossa, giocatore unito, giocatore-sinistra, ...) e il contenuto (se un giocatore si unisce, il contenuto sarebbe il nome per esempio)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.