Um servidor TCP cru (Raw Sockets) construído com Java puro, sem utilização de frameworks externos.
Este projeto foi desenvolvido a partir da curiosidade sobre fundamentos de redes e concorrência (Multithreading).
- Java Core (SE): Utilização pura da linguagem.
- Sockets TCP/IP: Conexões de rede via
SocketeServerSocket. - Thread Pool (ExecutorService): Arquitetura escalável para processamento de múltiplos clientes simultâneos (evitando o anti-pattern de uma Thread por conexão).
- Streams de I/O: Leitura e escrita de dados utilizando
BufferedReaderePrintWriter. - Observabilidade (JUL): Sistema de logs customizado gravando em arquivo e console, utilizando
java.util.logging. - Graceful Shutdown: Implementação de
Shutdown Hookspara interceptar sinais do Sistema Operacional (SIGINT) e encerrar conexões, liberar portas e desligar o Thread Pool com segurança. - Resiliência de Rede: Defesa contra ociosidade utilizando Timeouts e tratamento defensivo contra quebras de conexão pelo cliente.
O servidor escuta na porta 8080. Ao receber uma nova conexão, o ServerSocket delega a sessão do cliente (SessaoCliente) para um ExecutorService (Thread Pool).
Se o número de clientes exceder o limite do Pool, os novos clientes são colocados em uma fila de espera segura no nível do Sistema Operacional até que uma Thread seja liberada. Clientes ociosos por mais de 60 segundos são automaticamente desconectados pelo servidor.
- Java Development Kit (JDK) 11 ou superior.
- Um terminal com suporte a clientes TCP (como
telnetounetcat).
-
Clone o repositório:
git clone https://github.com/Jonass-C/raw-echo-server-java.git cd raw-echo-server-java -
Compile o projeto: O comando abaixo compila todos os arquivos
.javada pastasrce coloca os binários em uma pasta chamadaout.javac src/*.java -d out/ -
Inicie o servidor: Execute o programa a partir da raiz do projeto, indicando as classes na pasta
out(flag-cpde classpath).java -cp out/ ServidorTcp
-
Conecte um cliente (em outro terminal):
telnet localhost 8080
-
Interação:
- Digite qualquer mensagem para enviá-la ao servidor.
- Digite
sairouexitpara encerrar a conexão de forma limpa. - No terminal do servidor, pressione
Ctrl+Cpara observar o Graceful Shutdown em ação.
O servidor gera automaticamente um arquivo chamado servidor.log na raiz do diretório. Ele funciona em modo Append, preservando o histórico de eventos de execuções anteriores.