O que está envolvido na gravação de um servidor de lobby?

8

Então, eu estou escrevendo um sistema de partidas de xadrez baseado em uma visualização do Lobby com salas de jogos, bate-papo geral etc. Até agora, tenho um protótipo funcional, mas tenho grandes dúvidas sobre algumas coisas que fiz com o servidor. Escrever um servidor de lobby de jogos é uma nova experiência de programação para mim e, portanto, não tenho um modelo de programação claro nem preciso. Também não consegui encontrar um documento que descreva como deve funcionar. Encomendei "Java Network Programming 3rd edition" da Amazon e ainda aguardo o envio. Espero encontrar alguns exemplos / informações úteis neste livro.

Enquanto isso, gostaria de reunir suas opiniões e ver como você lida com algumas coisas para que eu possa aprender a escrever um servidor corretamente. Aqui estão algumas perguntas em cima da minha cabeça: (pode haver mais por vir)

Primeiro, vamos definir o que um servidor faz. Sua principal funcionalidade é manter conexões TCP com os clientes, ouvir os eventos que eles geram e enviá-los para os outros players. Mas há mais do que isso?

Devo usar um segmento por cliente? Nesse caso, 300 clientes = 300 threads. Isso não é demais? Que hardware é necessário para suportar isso? E quanta largura de banda um lobby consome então aprox?

Que tipo de estrutura de dados deve ser usada para armazenar os soquetes dos clientes? Como você o protege de modificações simultâneas (por exemplo, um jogador entra ou existe no lobby) ao iterá-lo para despachar um evento sem prejudicar o rendimento? ConcurrentHashMap é a resposta correta aqui, ou existem algumas técnicas que eu deveria conhecer?

Quando um usuário entra no lobby, que mecanismo você usaria para transferir o estado do lobby para ele? E enquanto isso está acontecendo, onde os outros eventos surgem?

Kira
fonte
300 threads são aceitáveis ​​em um sistema operacional moderno; em mais de 1000, você pode querer verificar outros sistemas como um não conectado.
Valmond 31/10

Respostas:

3

Modele tudo como objetos. Você tem sala de bate-papo, sessão de jogo, jogador ... Não crie novos tópicos para novos jogadores. Em vez disso, tente ver todas as classes como uma máquina de estado: um jogador pode ser conectado ou desconectado, ele tem um TcpConnection e uma variável que especifica quanto tempo resta para fazer a sua jogada (apenas como exemplo).

Então, quando você tiver todos os seus objetos em uma matriz ou algo parecido, itere-o a cada 10 milissegundos (o número é um exemplo muito claro) e tome as ações apropriadas.

Por exemplo, encerre uma sessão de jogo se um dos jogadores sair do jogo, envie movimentos de um jogador para o outro jogador ...

Para todos os eventos que acontecem no jogo, você deverá enviar uma mensagem pela rede. Crie uma classe / enumeração extra que contenha os diferentes tipos de mensagens. Se um jogador fizer uma jogada, você pode enviar para o servidor "mova d4 para d5" ou algo assim. Se você faz apenas um jogo de xadrez, pode enviar strings pela rede. Para algo mais complexo, sugiro que você envie apenas bytes únicos.

Normalmente, os pacotes de jogos consistem em: o tamanho do pacote, o tipo de mensagem / tipo de evento do pacote (movimento, jogador ingressado, jogador esquerdo ...) e o conteúdo (se um jogador ingressar, o conteúdo seria o nome para exemplo)

Riki
fonte