Ho un server di giochi Java TCP, io uso java.net.ServerSocket
e tutto funziona bene, ma recentemente il mio ISP ha fatto una sorta di aggiornamento, dove, se si inviano due pacchetti molto veloci per la stessa connessione TCP, li chiudono con la forza.Il mio ISP mi obbliga a bufferizzare i dati tcp prima di inviarlo
Questo è il motivo per cui un sacco di miei giocatori sono disconnesso in modo casuale quando c'è un sacco di traffico in gioco (quando c'è un sacco di possibilità che il server invierà 2 pacchetti al tempo stesso per la stessa persona)
Ecco un esempio di ciò che intendo: Se faccio qualcosa di simile, il mio ISP chiuderà il collegamento per alcun motivo per client e server side:
tcpOut.print("Hello.");
tcpOut.flush();
tcpOut.print("How are you?");
tcpOut.flush();
ma funzionerà bene se faccio qualcosa così:
tcpOut.print("Hello.");
tcpOut.flush();
Thread.sleep(200);
tcpOut.print("How are you?");
tcpOut.flush();
O questo:
tcpOut.print("Hello.");
tcpOut.print("How are you?");
tcpOut.flush();
Questo ha iniziato solo un paio di settimane fa, quando hanno (ISP) ha fatto alcune modifiche al servizio e la rete. Ho notato usando Wireshark che devi avere almeno ~ 150ms di tempo tra due pacchetti per la stessa connessione TCP altrimenti si chiuderà.
1) Ragazzi, sapete come si chiama? non ha nemmeno un nome? È legale?
Ora devo riscrivere il mio server di gioco sapendo che io uso un metodo chiamato: send(PrintWriter out, String packetData);
2) C'è qualche soluzione facile chiedere Java per tamponare i dati prima che lo invia ai clienti? O aspettare 150ms prima di ogni invio senza dover riscrivere il tutto? Ho fatto qualche ricerca su google, ma non riesco a trovare nulla che si occupi di questo problema. Qualche suggerimento o informazione per aiutare questo sarebbe molto apprezzato, btw l'ottimizzazione della velocità è molto cruciale. Grazie.
Questo non suona giusto. Lo stack TCP/IP locale bufferizzerà e ritarderà i dati in uscita in base alla velocità percepita della rete e, a meno che non stiate scherzando con tcpSetNoDelay, in genere ritarderà ulteriormente i pacchetti in modo da coalizzarli. Cosa vedi che ti fa pensare che ci sia una chiusura forzata? E i tuoi utenti possono realmente digitare 6 righe al secondo? o è solo la tua applicazione a svuotarsi inutilmente dopo ogni nuova riga? – EJP
Grazie EJP per il tuo commento. Sono sicuro al 100% che l'ISP stia chiudendo la connessione, lo vedo su Wireshark quando ottengo un pacchetto di reset rosso. Ho anche fatto alcuni test. A volte i dati vengono aggiunti in un pacchetto come hai appena detto (stack TCP/IP locale) ma a volte non succede quando il mio server ha un sacco di flushing da fare. È un gioco MMORPG, quindi quando gli utenti parlano, muovono, attaccano, ecc. Contemporaneamente sulla mappa, c'è un sacco di flushings da fare, quindi ad un certo punto due pacchetti vengono inviati contemporaneamente a un giocatore, e il mio ISP si chiude quella presa. – Reacen
E per "stesso tempo" intendo con un ritardo inferiore a 100 ms. – Reacen