Para os códigos aqui disponibilizados optou-se por uma organização simplificada para facilitar a leitura e entendimento. Contudo, o código aqui apresentado tem grande potencial de melhorias para torná-lo adequado para atender situações reais ou mesmo, para atender demandas das listas de exercícios e projetos desenvolvidos dentro da disciplina.
Java possui diferentes APIs para lidar com operações de I/O. A API Java NIO.2 permite desenvolver aplicações com comunicação assíncrona, porém seu entendimento demanda mais tempo. A partir do Java 21 é possível usar virtual threads para comunicação síncrona e bloqueante como alternativa para comunicação assíncrona (thread física fica liberada enquanto socket não recebe bytes). Isso permite milhões de conexões abertas simultaneamente de forma semelhante a arquitetura assíncrona pura.
No arquivo build.gradle.kts foram criadas tarefas para permitir executar servidor e o cliente (TCP e UDP) diretamente com o gradle. Abaixo são apresentados os comandos para execução dos exemplos.
O servidor cria uma Thread para atender cada cliente e essa Thread é destruída após isso.
%%{init: {'sequence': {'mirrorActors':false} } }%%
sequenceDiagram
Servidor ->> Servidor: cria socket
loop Servidor aguarda por conexões de Clientes
Cliente ->> Servidor: conecta
create participant AtenderCliente
Servidor -->> AtenderCliente: Criar thread com dados do cliente
end
Cliente ->> AtenderCliente: Olá, servidor!
AtenderCliente ->> AtenderCliente: imprimir mensagem recebida
AtenderCliente -->> Cliente: Mensagem recebida com sucesso!
Cliente ->> Cliente: imprimir resposta do servidor
destroy AtenderCliente
Servidorcria socket TCP e aguarda por conexõesClienteconecta no servidorServidorcria uma Thread (AtenderCliente) para atender oClienteClienteenvia mensagem de saudaçãoAtenderClienteimprime a mensagem recebida no consoleAtenderClienteenvia resposta aoClienteClienteimprime a mensagem recebida no consoleAtenderClienteé encerradaClienteé encerrado
Abra um terminal e execute uma das linhas abaixo de acordo com o sistema operacional do computador que esteja usando.
# No Linux ou macOS
./gradlew servidorTcp
# No Windows
gradle.bat servidorTcpAbra um outro terminal e execute uma das linhas abaixo.
# Tentará conectar na porta 12345 na localhost
./gradlew clienteTcp
# Passando o IP e porta do tcp como argumentos de linha de comando
./gradlew clienteTcp --args "localhost 12345"%%{init: {'sequence': {'mirrorActors':false} } }%%
sequenceDiagram
Servidor ->> Servidor: cria socket
Cliente ->> Cliente: cria socket
Cliente ->> Servidor: Olá, eu sou o cliente UDP!
Servidor ->> Servidor: imprime mensagem recebida
Servidor ->> Cliente: Olá, eu sou o servidor UDP!
Cliente ->> Cliente: imprime mensagem recebida
- Servidor cria socket UDP
- Cliente cria socket UDP
- Servidor aguarda por datagrama
- Cliente envia datagrama
- Cliente aguarda por datagrama
- Servidor imprime no console
- Servidor envia datagrama
- Cliente imprime no console
Abra um terminal e execute a linha abaixo.
./gradlew servidorUdpAbra um outro terminal e execute uma das linhas abaixo.
# Tentará conectar na porta 9876 na localhost
./gradlew clienteUdp
# Passando o IP e porta do tcp como argumentos de linha de comando
./gradlew clienteUdp --args "localhost 9876"Neste exemplo, o servidor envia periodicamente uma mensagem com sua hora local para um grupo de clientes que estão escutando em um endereço multicast.
O cliente, para todas interfaces de rede, escuta em um endereço multicast e imprime no console a mensagem recebida do servidor.
Abra um terminal e execute a linha abaixo.
./gradlew servidorMulticastAbra um outro terminal e execute a linha abaixo.
./gradlew clienteMulticastPara encerrar a execução do servidor ou do cliente, pressione Ctrl+C no terminal onde o programa está sendo executado.
Para ambos os casos, o endereço multicast utilizado é 231.0.0.0 e a porta 8888. É possível passar outros valores como argumentos de linha de comando.
./gradlew servidorMulticast --args "231.0.0.1 8889"
./gradlew clienteMulticast --args "231.0.0.1 8889"- https://en.wikipedia.org/wiki/Multicast_address
- https://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml
- https://github.com/jppf-grid/JPPF/blob/master/common/src/java/org/jppf/comm/discovery/JPPFBroadcaster.java
- https://github.com/jppf-grid/JPPF/blob/master/client/src/java/org/jppf/client/JPPFMulticastReceiverThread.java
- https://github.com/jppf-grid/JPPF/blob/master/common/src/java/org/jppf/comm/discovery/JPPFMulticastReceiver.java
