2011-09-28 11 views
7

Per un progetto scolastico, dovremmo creare un gioco multiplayer in Java (dovrebbe essere client/server) che può essere riprodotto su Internet (stiamo programmando questo a scuola, quindi non è compito a casa). Il gioco è a turni, ma dovrebbe esserci una chat, che naturalmente è in tempo reale. Tuttavia, nessuno di noi ha esperienza con la programmazione di rete e più ne leggo, più domande sembrano avere.Gioco multiplayer Java - concetti di networking

Il mio primo pensiero è stato utilizzare l'API socket per implementare la parte multiplayer. Il server attende nuovi dati dai client. Tuttavia, ci sono più tipi di dati da ricevere, come i messaggi di chat, i movimenti, ecc. Inoltre, una volta stabilita la connessione al server, devono essere inviati alcuni dati iniziali (come il nome del giocatore). Il server dovrebbe essere in grado di vedere che tipo di messaggio ha ricevuto, ma come? Stavo pensando di creare una classe Message con un campo stringa type. Ma nel mio codice server, mi metterò codice come questo:

Quando ci sono un sacco di diversi tipi di dati da inviare (e ci sarà), questo non sembra che il modo più efficiente. Inoltre, questo significherebbe sia il server che il client dovrebbero avere questa classe/interfaccia Message (codice duplicato).

E gli altri giochi? Ad esempio, il giocatore 1 muove il suo personaggio in una posizione che sconfigge un altro personaggio. Il client del giocatore 1 calcola questa sconfitta e applica le azioni corrette. Ma cosa dovrebbe essere inviato al server? Solo la nuova posizione del giocatore o anche la sconfitta? Con la prima opzione, significa che tutti gli altri client dovrebbero fare i calcoli. Non potrebbe causare problemi? Poiché non ho esperienza di programmazione di rete precedente, sono un po 'confuso su come fare tutte queste cose.

Ho anche letto in un altro thread qui su Stackoverflow che RMI potrebbe essere un'opzione migliore. Dopo aver letto alcune informazioni su questo, capisco cosa sia RMI, ma non riesco ancora a vedere se è una buona opzione per questo progetto o meno. Qualche consiglio per questo?

Come vedi, sono un po 'confuso su come iniziare con la parte di rete di questo progetto. Ho cercato alcuni libri di programmazione di giochi (per Java ofcourse), ma nessuno di loro è focalizzato sulla parte di rete. Ho anche cercato i libri di networking Java, ma questi sembrano essere focalizzati sulla tecnologia, non su buone pratiche di codice.

Se qualcuno conosce un buon libro o ha qualche consiglio nella giusta sezione, sarebbe molto apprezzato.

Grazie

+7

"... programmarlo a scuola, quindi non è compito" . Classico. – CPerkins

+0

Almeno non vuole il codice. –

+0

@CPerkins: Dovremmo lavorare a questo progetto a scuola, sì. Non sto chiedendo a nessuno di fare il mio lavoro, semplicemente chiedendo consigli su come implementarlo. – Bv202

risposta

7

Sei sulla strada giusta, ma ci sono alcune cose da chiarire.

Se stai utilizzando le prese, hai capito che è necessario definire un protocollo, un linguaggio comune per comunicare le mosse e lo stato del gioco. Socket ti consente di inviare qualsiasi tipo di dati in quasi tutti i formati che desideri. Sembra che tu stia pensando di serializzare un messaggio di classe per inviare questo tipo, questo è uno dei fare cose. Se usi RMI (che ha il suo protocollo), agirai come se stessi chiamando metodi Java, ma in pratica stai facendo qualcosa di simile, serializzando i dati e passandoli su un socket.

Non c'è nulla di implicitamente sbagliato nella condivisione del codice tra il client e il server - in effetti, la maggior parte dei servizi lo fa in qualche modo. Sia il client che il server potrebbero utilizzare una libreria comune per definire le classi di messaggi trasmesse. RMI utilizza gli stub del metodo per determinare l'interfaccia. I servizi Web di tutti i tipi definiscono come vengono invocati i metodi. L'idea generale è di esporre solo l'interfaccia, non l'implementazione.

Per quanto riguarda il codice, potrebbe essere più pulito avere una sottoclasse di messaggi diversa per ciascun tipo di messaggio e inserire parametri aggiuntivi per ciascun messaggio. Si potrebbe quindi avere una classe MessageProcessor come:

class MessageProcessor{ 
    void process(Move1Message m) {...} 
    void process(Move2Message m) {...} 
    .... 

} 

Per quanto riguarda cosa inviare - il principio generale dovrebbe essere che il cliente è responsabile per l'invio di loro movimento al server, tutto il resto lo fa è un vantaggio, perché il server ha bisogno di verificare la legalità della mossa. Il server dovrebbe sempre essere il determinante dello stato del gioco per evitare imbrogli e implementazioni errate del client

A meno che non si sia interessati a imparare come implementare il proprio protocollo o utilizzare la libreria Java Sockets, sarà più facile usa RMI. Potresti anche usare SOAP, REST o qualsiasi altro protocollo, ma non mi preoccuperei di pensare troppo a quale usare al momento. Non ho alcun suggerimento oltre the RMI documentation, anche se penso che this book abbia molti esempi di codice per il networking.

0

quando si va con prese ogni cliente avrà il proprio connessione per la quale un thread del server attenderà (non dimenticate di svuotare il flusso sul lato client o ti aspettare per sempre)

ogni linea sarà un messaggio separato e per differenziare i tipi di messaggio è possibile utilizzare un "header" all'inizio di ogni messaggio (una sequenza di 3 caratteri all'inizio) dire msg, mov, lgn e utilizzare una selezione di tipo trie -like con interruttori per decidere rapidamente quale hai ottenuto


wh con RMI puoi avere il server per mantenere un oggetto manager (esportato e registrato nel registro) su cui un client può richiedere un oggetto "connessione" che sarà lo stesso della connessione nell'implementazione socket ma sarai in grado avere un metodo per ogni cosa che vuoi fare anche se i callback dovranno essere fatti in qualche altro modo (con i socket hai una connessione pronta per questo)

Problemi correlati