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.
- 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
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
- Java 11 ou superior
- Maven 3.6 ou superior
mvn clean compilemvn exec:java -Dexec.mainClass="com.gameserver.GameServerApplication"mvn exec:java -Dexec.mainClass="com.gameserver.client.GameClient"mvn package
java -jar target/netty-fluent-tcp-server-1.0.0.jarGameServer 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();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();CONNECT- Conexão inicialDISCONNECT- DesconexãoAUTHENTICATION- Autenticação do usuárioAUTHENTICATION_RESPONSE- Resposta de autenticaçãoHEARTBEAT- Manutenção da conexão
PLAYER_JOIN- Jogador entra na salaPLAYER_LEAVE- Jogador sai da salaPLAYER_MOVE- Movimento do jogadorPLAYER_UPDATE- Atualização do jogadorPLAYER_ACTION- Ação do jogadorPLAYER_CHAT- Chat do jogador
GAME_START- Início do jogoGAME_END- Fim do jogoGAME_STATE- Estado do jogoGAME_UPDATE- Atualização do jogoGAME_EVENT- Evento do jogo
ERROR- ErroSUCCESS- SucessoNOTIFICATION- NotificaçãoBROADCAST- Transmissão
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();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());// 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);// Criar resposta
GamePacket response = new GamePacket(PacketType.SUCCESS)
.withPlayerId(originalPacket.getPlayerId())
.withData("success", true)
.withData("message", "Operação realizada com sucesso");
ctx.writeAndFlush(response);| 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) |
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"/>mvn exec:java -Dexec.mainClass="com.gameserver.GameServerApplication"mvn exec:java -Dexec.mainClass="com.gameserver.client.GameClient"- Connect - Conecta ao servidor
- Authenticate - Autentica com credenciais
- Join Room - Entra em uma sala
- Move Player - Move o jogador
- Send Chat - Envia mensagem de chat
- Start Game - Inicia um jogo
- Heartbeat - Envia heartbeat
- Custom Packet - Envia pacote customizado
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.
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(),
}- Netty 4.1.122.Final - Framework de rede
- Jackson 2.16.1 - Serialização JSON
- SLF4J + Logback - Sistema de logging
- JUnit 5 - Testes (opcional)
- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/nova-feature) - Commit suas mudanças (
git commit -am 'Adiciona nova feature') - Push para a branch (
git push origin feature/nova-feature) - Abra um Pull Request
Este projeto está licenciado sob a Apache License 2.0 - veja o arquivo LICENSE para detalhes.
- Porta já em uso: Mude a porta usando
.port(outra_porta) - Problemas de criptografia: Verifique se cliente e servidor usam a mesma chave
- Timeout de conexão: Ajuste o
idleTimeoutconforme necessário - Performance: Ajuste
bossThreadseworkerThreadspara seu hardware
# Ver logs em tempo real
tail -f logs/gameserver.log
# Filtrar logs por nível
grep "ERROR" logs/gameserver.log