Sto scrivendo un server di gioco per un gioco a turni in Java. Questi sono i fatti:Quale protocollo scegliere per un server di gioco a turni
- La velocità del gioco è lento, quindi i clienti devono inviare i dati diciamo ogni 8 secondi, e che i dati sono il più delle volte solo un piccolo aggiornamento incrementale (poche decine di byte), a parte situazioni come unirsi al gioco o elencare giochi disponibili ecc.
- Il server deve supportare un gran numero di giocatori che, diciamo 1000, che giocano una delle poche centinaia di giochi
- Quando il giocatore fa un turno , gli altri giocatori nella stessa partita devono essere informati della mossa. Il numero massimo di giocatori nel gioco è di circa 10
Prima di tutto, ho escluso UDP dal mio elenco di opzioni in quanto ho bisogno di un protocollo affidabile perché in rare situazioni ho davvero bisogno di inviare alcuni dati che non possono stare in uno pacchetto e non voglio preoccuparmi di unire pacchetti e cose simili, rintracciando l'ordine dei pacchetti arrivati e altre cose di basso livello.
Quindi il dilemma è se utilizzare TCP o HTTP.
tentativo TCP # 1
La connessione dal client al server (e viceversa) è aperto tutto il tempo. In questo modo, quando un giocatore fa una mossa, il server può facilmente notificare agli altri giocatori nel gioco quale mossa è stata fatta. La cosa principale che mi dà fastidio con questo approccio è se sia consigliabile o addirittura possibile avere fino a 1000 connessioni e socket aperti tutto il tempo?
tentativo TCP # 2
L'alternativa che ho pensato di è, da utilizzare per stabilire una connessione separata/presa su ogni richiesta da un client. Un client aprirà una connessione, invierà alcuni piccoli dati al server e chiuderà quella connessione. Con questo approccio, posso avere un pool di thread di dimensioni fisse di diciamo 10 ed elaborare le richieste del client in ogni thread separatamente in modo che ci siano al massimo 10 connessioni/socket aperti in qualsiasi momento. Ma ci sono due cose che mi dà fastidio con questo approccio:
- expensiveness di apertura/chiusura della connessione al client
- il modo di notificare altri giocatori nel gioco, dal momento che la connessione a loro è probabilmente chiuso . Ognuno di loro dovrebbe in quel caso il server "poll" per l'aggiornamento diciamo ogni secondo.
Qual è il costo di stabilire un socket/connessione TCP? Si tratta di un'operazione costosa o viene eseguita in pochi ms (o meno)?
HTTP
- Ci sarebbe un sacco di overhead se sarei invio di un nuovo GET/POST solo per inviare alcuni byte?
- Posso mantenere 1000 connessioni HTTP a client contemporaneamente e quindi utilizzare AJAX o cose simili per ridurre l'overhead ?In tal caso, le connessioni simultanee 1000 rappresentano un problema significativo relativo alla larghezza di banda /prestazioni?
Sono aperto a suggerimenti/consigli di qualsiasi tipo.
about # 2: Dovrai autenticare il lettore ogni volta che viene stabilita la connessione ... Anche questo potrebbe essere lento !? – opatut
Sia il client che il server sono scritti in Java? – Kylotan
Ci sono diversi client, uno dei quali è in Java, ma sto cercando una soluzione generale. – eold