Skip to content

claytim/gameserver-netty

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 

Repository files navigation

Netty Fluent TCP Game Server

Uma aplicação Java que funciona como uma fluent API para um servidor TCP usando Netty, especialmente projetado para jogos online. O servidor suporta criptografia AES-256 e processamento separado de pacotes através de handlers modulares.

🚀 Características

  • Fluent API: Interface intuitiva e fácil de usar para configuração do servidor
  • Criptografia AES-256: Protege a comunicação entre cliente e servidor
  • Processamento Modular: Handlers separados para diferentes tipos de pacotes
  • Suporte Completo a Jogos: Pacotes específicos para autenticação, movimento de jogadores, chat, etc.
  • Alta Performance: Baseado no framework Netty para máxima eficiência
  • Configuração Flexível: Threads, timeouts, logging e criptografia configuráveis

📦 Estrutura do Projeto

src/main/java/com/gameserver/
├── GameServer.java                    # Classe principal com fluent API
├── GameServerApplication.java         # Aplicação de exemplo
├── packet/
│   ├── GamePacket.java               # Classe de pacote com serialização JSON
│   └── PacketType.java               # Enum com tipos de pacotes
├── crypto/
│   └── PacketCrypto.java             # Sistema de criptografia AES-256
├── handler/
│   ├── PacketHandler.java            # Interface para handlers
│   ├── PacketHandlerRegistry.java    # Registro de handlers
│   └── impl/
│       ├── AuthenticationHandler.java # Handler de autenticação
│       └── PlayerHandler.java        # Handler de jogadores
├── codec/
│   ├── GamePacketDecoder.java        # Decoder Netty
│   └── GamePacketEncoder.java        # Encoder Netty
├── netty/
│   └── GameServerHandler.java        # Handler principal do Netty
└── client/
    └── GameClient.java               # Cliente de exemplo

🛠️ Instalação e Execução

Pré-requisitos

  • Java 11 ou superior
  • Maven 3.6 ou superior

Compilar o Projeto

mvn clean compile

Executar o Servidor

mvn exec:java -Dexec.mainClass="com.gameserver.GameServerApplication"

Executar o Cliente de Teste

mvn exec:java -Dexec.mainClass="com.gameserver.client.GameClient"

Gerar JAR Executável

mvn package
java -jar target/netty-fluent-tcp-server-1.0.0.jar

💻 Uso da Fluent API

Exemplo Básico

GameServer server = GameServer.create()
    .port(8080)                    // Define a porta
    .encryption(true)              // Habilita criptografia
    .withDefaultHandlers()         // Usa handlers padrão
    .start();                      // Inicia o servidor

// Aguarda encerramento
server.awaitTermination();

Configuração Avançada

GameServer server = GameServer.create()
    .port(9090)
    .encryption(true)
    .encryptionKey("sua-chave-base64-aqui")  // Chave específica
    .bossThreads(2)                          // 2 threads para aceitar conexões
    .workerThreads(8)                        // 8 threads para I/O
    .logging(true)                           // Logging do Netty
    .idleTimeout(600)                        // Timeout de 10 minutos
    .withDefaultHandlers()
    .registerHandler(new CustomHandler())    // Handler customizado
    .start();

📡 Tipos de Pacotes Suportados

Conexão e Autenticação

  • CONNECT - Conexão inicial
  • DISCONNECT - Desconexão
  • AUTHENTICATION - Autenticação do usuário
  • AUTHENTICATION_RESPONSE - Resposta de autenticação
  • HEARTBEAT - Manutenção da conexão

Jogador

  • PLAYER_JOIN - Jogador entra na sala
  • PLAYER_LEAVE - Jogador sai da sala
  • PLAYER_MOVE - Movimento do jogador
  • PLAYER_UPDATE - Atualização do jogador
  • PLAYER_ACTION - Ação do jogador
  • PLAYER_CHAT - Chat do jogador

Jogo

  • GAME_START - Início do jogo
  • GAME_END - Fim do jogo
  • GAME_STATE - Estado do jogo
  • GAME_UPDATE - Atualização do jogo
  • GAME_EVENT - Evento do jogo

Sistema

  • ERROR - Erro
  • SUCCESS - Sucesso
  • NOTIFICATION - Notificação
  • BROADCAST - Transmissão

🔒 Criptografia

O servidor usa criptografia AES-256-CBC para proteger a comunicação:

// Servidor com criptografia habilitada (chave gerada automaticamente)
GameServer server = GameServer.create()
    .encryption(true)
    .start();

// Usar chave específica
GameServer server = GameServer.create()
    .encryptionKey("sua-chave-base64")
    .start();

// Desabilitar criptografia
GameServer server = GameServer.create()
    .encryption(false)
    .start();

🎯 Criando Handlers Customizados

public class CustomHandler implements PacketHandler {
    @Override
    public boolean canHandle(GamePacket packet) {
        return packet.getType() == PacketType.CUSTOM;
    }
    
    @Override
    public void handle(ChannelHandlerContext ctx, GamePacket packet) {
        String customData = packet.getDataAsString("customData");
        
        // Processa o pacote customizado
        GamePacket response = new GamePacket(PacketType.SUCCESS)
            .withPlayerId(packet.getPlayerId())
            .withData("processed", true)
            .withData("originalData", customData);
        
        ctx.writeAndFlush(response);
    }
    
    @Override
    public int getPriority() {
        return 100; // Prioridade (menor = maior prioridade)
    }
    
    @Override
    public String getHandlerName() {
        return "CustomHandler";
    }
}

// Registrar o handler
server.registerHandler(new CustomHandler());

📝 Criando e Enviando Pacotes

No Cliente

// Pacote de autenticação
GamePacket authPacket = new GamePacket(PacketType.AUTHENTICATION)
    .withPlayerId("player123")
    .withData("username", "jogador1")
    .withData("password", "123456");

client.sendPacket(authPacket);

// Pacote de movimento
GamePacket movePacket = new GamePacket(PacketType.PLAYER_MOVE)
    .withPlayerId("player123")
    .withData("x", 100.5)
    .withData("y", 200.0)
    .withData("z", 50.25)
    .withData("roomId", "sala001");

client.sendPacket(movePacket);

No Servidor (Handler)

// Criar resposta
GamePacket response = new GamePacket(PacketType.SUCCESS)
    .withPlayerId(originalPacket.getPlayerId())
    .withData("success", true)
    .withData("message", "Operação realizada com sucesso");

ctx.writeAndFlush(response);

🔧 Configuração

Parâmetros do Servidor

Parâmetro Padrão Descrição
port 8080 Porta do servidor
encryption true Habilita/desabilita criptografia
encryptionKey null Chave de criptografia personalizada
bossThreads 1 Threads para aceitar conexões
workerThreads 0 (auto) Threads para processamento I/O
logging true Logging do Netty
idleTimeout 300 Timeout de inatividade (segundos)

Logging

O projeto usa Logback. Configure os níveis de log em src/main/resources/logback.xml:

<!-- Log da aplicação -->
<logger name="com.gameserver" level="DEBUG"/>

<!-- Log do Netty -->
<logger name="io.netty" level="INFO"/>

🧪 Teste

Executar o Servidor

mvn exec:java -Dexec.mainClass="com.gameserver.GameServerApplication"

Executar o Cliente

mvn exec:java -Dexec.mainClass="com.gameserver.client.GameClient"

Comandos do Cliente de Teste

  1. Connect - Conecta ao servidor
  2. Authenticate - Autentica com credenciais
  3. Join Room - Entra em uma sala
  4. Move Player - Move o jogador
  5. Send Chat - Envia mensagem de chat
  6. Start Game - Inicia um jogo
  7. Heartbeat - Envia heartbeat
  8. Custom Packet - Envia pacote customizado

🎮 Integração com Go Lang

Este servidor Java foi projetado para trabalhar com clientes Go. O formato de pacotes JSON e o sistema de criptografia AES-256 são compatíveis com implementações Go.

Exemplo de Cliente Go

type GamePacket struct {
    Type      string                 `json:"type"`
    PlayerId  string                 `json:"playerId"`
    Data      map[string]interface{} `json:"data"`
    Timestamp int64                  `json:"timestamp"`
}

// Enviar pacote de autenticação
packet := GamePacket{
    Type:     "AUTHENTICATION",
    PlayerId: "player123",
    Data: map[string]interface{}{
        "username": "jogador1",
        "password": "123456",
    },
    Timestamp: time.Now().UnixMilli(),
}

📚 Dependências

  • Netty 4.1.122.Final - Framework de rede
  • Jackson 2.16.1 - Serialização JSON
  • SLF4J + Logback - Sistema de logging
  • JUnit 5 - Testes (opcional)

🤝 Contribuição

  1. Fork o projeto
  2. Crie uma branch para sua feature (git checkout -b feature/nova-feature)
  3. Commit suas mudanças (git commit -am 'Adiciona nova feature')
  4. Push para a branch (git push origin feature/nova-feature)
  5. Abra um Pull Request

📄 Licença

Este projeto está licenciado sob a Apache License 2.0 - veja o arquivo LICENSE para detalhes.

🔍 Troubleshooting

Problemas Comuns

  1. Porta já em uso: Mude a porta usando .port(outra_porta)
  2. Problemas de criptografia: Verifique se cliente e servidor usam a mesma chave
  3. Timeout de conexão: Ajuste o idleTimeout conforme necessário
  4. Performance: Ajuste bossThreads e workerThreads para seu hardware

Logs Úteis

# Ver logs em tempo real
tail -f logs/gameserver.log

# Filtrar logs por nível
grep "ERROR" logs/gameserver.log

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages