Olá pessoal, estou desenvolvendo um servidor de um jogo em java.
Mas eu esbarrei no seguinte problema:
Eu poderia criar uma thread para cada player! Mas o problema é que o servidor deveria comportar uns 300 players, mas usando este método não seria possível!
Eu estava querendo usar Socket Assync, mas não acho documentação teórica em português, nem uns exemplos de como usar ou como ele funciona em java!
Apesar de alguns chamarem de “async socket”, acredito que o termo é incorreto. Socket implica conexão, e uma ação qualquer ocorre sempre após o recebimento de uma mensagem pelo protocolo. O termo que eu acho mais correto é socket não-bloqueante. Vou dizer que nunca precisei usar esta alternativa. Sei que existem opções tanto em C quanto em Java, mas nunca cheguei a programar com elas.
Mas meu ponto não esse. O que eu gostaria de dizer é que criar threads para cada usuário é errado, em qualquer domínio de aplicação em que você for trabalhar. O motivo você mesmo já descobriu: o sistema se sobrecarrega quando há bastante clientes. E não existe nenhuma técnica especial que resolva, nem mesmo socket assíncrono.
Em qualquer domínio do tipo cliente-servidor (inclusive aplicações web) existe sempre uma thread para cada requisição e não para cada usuário. E cada requisição é stateless, ou seja, não depende de nenhum estado deixado por uma requisição anterior.
Pode ser que você queira manter conexões persistentes para que o servidor mande informações para os clientes na hora que quiser. Mas aí você tem várias conexões, não várias threads.
Na verdade, a grande vantagem do socket não bloqueante é a que você falou. Você pode usar uma única thread para gerenciar várias conexões socket. Com o socket bloqueante isso não é possível, pois seu código irá “travar” no método de leitura. Portanto, para fazer várias leituras “simultâneas” você se vê forçado a usar várias threads.
Acho que o HTTP é um péssimo exemplo, justamente por se tratar de conexões stateless. Aliás, uma coisa que sempre me irritou em código web, é a quantidade absurda de gambiarras para driblar essa característica do protocolo já que, uns 99% das aplicações precisam manter estado.
Não sei o quão dinâmico é o seu jogo. Mas se for um jogo de ação, como um MMO, considere fortemente a possibilidade de usar UDP e não TCP. O TCP tem garantia de entrega e ordenação, e muitas vezes ela é indesejavel, pois aumenta consideravelmente o lag.