Sfide in Android Game Server multi-player con RESTful Nature

2

Sto lavorando a un gioco Android basato su Contract Bridge , come parte del mio progetto Summer Internship. Il gioco sarà multi-player in modo tale che 4 dispositivi Android possano riprodurlo, quindi non è possibile sviluppare alcun lettore BOT o CPU. Al momento del progetto, mi sono reso conto che la maggior parte degli studenti aveva già lavorato al progetto, ma nessuno dei loro lavori è riutilizzabile ora (per svariati motivi come codice non documentato e architettura di progettazione, implementazione di piattaforme diverse).

Ho esperienza di lavoro su diversi progetti open source e quindi mi preme enfatizzare su questo progetto in modo tale che i componenti che faccio diventano riutilizzabili il più possibile. Ora, dato che il gioco è multi-player e l'intero avanzamento del gioco sarà gestito sul server, attualmente sto lavorando al design di Server, dal momento che volevo rendere riutilizzabile il server di gioco in modo tale che qualsiasi piattaforma client possa usarlo, in precedenza ero confuso nella selezione di Socket o REST per la progettazione di Game Server, ma in seguito finalizzato a lavorare sulle API REST per il server.

Ora, dato che devo tenere tutti i giocatori in sincrono mentre fanno movimenti nel gioco, sul server ho pianificato di usare il Database che manterrà i progressi di tutti i giocatori, specifici per ogni tavolo (in Bridge, 4 giocatori giocano su una singola tabella, e il server gestirà molte di queste tabelle di gioco).

Non so se è una decisione appropriata utilizzare il database come mezzo condiviso per tenere traccia dell'avanzamento di ogni tabella di gioco (fammi sapere se esiste un'opzione appropriata o migliore). Ovviamente, quando il gioco è completato per la tabella, i dati per quella tabella sul database del server vengono scartati.

Ora il problema è che, l'accesso al servizio REST è una chiamata HTTP, quindi fintanto che il client non fa alcuna richiesta, il server rimarrà inattivo e prenderà in considerazione una situazione in cui

  • Un giocatore ha giocato una carta sul suo dispositivo e il dispositivo richiede di applicare questa modifica sul server.
  • Ora, ho bisogno che il resto dei tre dispositivi sappia che il giocatore ha giocato una carta e aggiorna anche la vista sul proprio dispositivo.
  • AFAIK, REST non può fornire un sistema di notifica push di tipo ordinamento, poiché la connessione al server non è persistente.
    • Una soluzione che ho pensato è stata quella di fare in modo che ogni dispositivo esegua costantemente il polling del server per qualsiasi modifica (come ogni 56 ms) e quando vengono rilevate modifiche, rifletterlo sul dispositivo. Ma ritengo che questo non sia un modo elegante, dal momento che ogni richiesta HTTP è costosa. (e scelgo REST per rendere l'esperienza di gioco robusta da quando, un dispositivo mobile tende a disconnettersi da Internet, e se c'è una connessione persistente come Socket, l'intero avanzamento del gioco è soggetto a perdita. Inoltre, la portabilità sul client-end è importante)
  • Inoltre, immaginando una situazione in cui sono in gioco 10 tavoli da gioco e 40 giocatori, un server deve essere in grado di gestire richieste HTTP allagate da tutti i dispositivi che lo fanno ogni 56 ms. Quindi mi chiedo se la situazione è assunta come attacco DoS.

Quindi, spiegando la situazione, sto andando nella giusta direzione per la progettazione del server? Volevo essere sicuro prima di procedere ulteriormente con il codice.

    
posta Kushal 05.06.2012 - 11:04
fonte

2 risposte

1

L'uso del riposo per inviare / ricevere dati al / dal server è una buona scelta, è un protocollo ben noto e stabile per la comunicazione client-server. Tuttavia, avrai bisogno di un sistema per inviare aggiornamenti (o notifiche) ai client mentre cambiano sul server, e per fare ciò hai bisogno di qualcosa di diverso dalle connessioni web http.

Su un dispositivo Android, è meglio utilizzare la tecnologia push: Google ha un pochi siti che parlano sull'implementazione di questo tipo di cose. Quando ricevi la notifica, se non contiene già i dati, può essere utilizzata come innesco per l'app per recuperare i dati utilizzando i tuoi metodi abituali (ovvero fai clic automaticamente sul pulsante "Aggiorna")

Se non vuoi usare i sistemi push, l'altra risposta è quella di aprire un socket tcp / ip persistente sul server mentre i giocatori stanno giocando attivamente e ricevono notifiche e dati direttamente attraverso questo.

    
risposta data 05.06.2012 - 12:56
fonte
0

checkout jWebSockets , un'implementazione android del protocollo websocket. avere qualcosa come socket.io sul server e un client websocket sul dispositivo mobile dovrebbe semplificarti la vita.

Sarai su socket TCP bidirezionali e non avrai bisogno di push.

    
risposta data 10.07.2012 - 07:41
fonte

Leggi altre domande sui tag