20/02/2026
Em um sistema distribuído, os processos possuem responsabilidades bem definidas e interagem para realizar uma atividade útil. Existem dois principais modelos de arquitetura de sistemas distribuídos: cliente-servidor e peer-to-peer.
É a arquitetura mais citada quando se trata de sistemas distribuídos. Esta arquitetura é a espinha dorsal da internet e da maioria dos sistemas modernos. É um modelo que divide seus participantes entre dois tipos: quem utiliza um determinado serviço e quem o fornece.

Nesta arquitetura, todos os processos envolvidos em uma atividade possuem funções semelhantes, interagindo cooperativamente como pares (peers), sem uma distinção entre clientes e servidores. Esse é um modelo mais flexível para escalabilidade de compartilhamento de dados e outros recursos.

O modelo cliente-servidor possui algumas variações que são relevantes, entre elas:
Um servidor proxy é um "intermediário" entre um cliente e um servidor. É uma espécie de "porteiro digital" que pode rotear uma mensagem de acordo com uma necessidade.
Algumas possíveis funções de um servidor proxy:

É um padrão assíncrono que desacopla que produz (publicadores) de consumidores (assinantes). Os publicadores enviam mensagens a tópicos (ou filas) sem saber quem as receberá, enquanto assinantes recebem mensagens de tópicos específicos.
Exemplos: Apache Kafka, RabbitMQ, Redis, JMS, AWS SNS.

// Servidor.java
import java.io.*;
import java.net.*;
public class Servidor {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(12345)) {
System.out.println("Servidor aguardando conexão...");
Socket socket = serverSocket.accept(); // Aguarda conexão
System.out.println("Cliente conectado!");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String mensagem = in.readLine();
System.out.println("Mensagem recebida: " + mensagem);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}// Cliente.java
import java.io.*;
import java.net.*;
public class Cliente {
public static void main(String[] args) {
try (Socket socket = new Socket("localhost", 12345)) {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Olá, Servidor!"); // Envia mensagem
System.out.println("Mensagem enviada.");
} catch (IOException e) {
e.printStackTrace();
}
}
}