docs: refinamento integral da documentação didática

Índices por jornada, convenções, diagramas Mermaid, correções de
arquitetura (MainShellFrame, TCP/PluginManager), tutoriais com
verificações e troubleshooting; remove redirect pitiupi/docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Gabriel Felipe Souza SantosandCursor committed 2026-10-27 21:25:19 -03:00
1 parent 7460465f81
commit de65f3063f
18 files changed
+383 -126

No files matched your search

+1 -1
View File
@@ -2,7 +2,7 @@
Ferramenta **P2P** para práticas de Redes de Computadores: núcleo em Java com arquitetura de **plugins** (conversa na rede e compartilhamento de tela). Ferramenta **P2P** para práticas de Redes de Computadores: núcleo em Java com arquitetura de **plugins** (conversa na rede e compartilhamento de tela).
**Documentação completa:** [docs/README.md](docs/README.md) · **Quickstart:** [docs/documentation/00_quickstart.md](docs/documentation/00_quickstart.md) **Documentação:** [docs/README.md](docs/README.md) (trilhas aluno, redes e dev) · **Quickstart:** [docs/documentation/00_quickstart.md](docs/documentation/00_quickstart.md) · **Convenções:** [docs/documentation/00_convencoes.md](docs/documentation/00_convencoes.md)
--- ---
+17 -21
View File
@@ -1,35 +1,31 @@
# Documentação — Pitiupi # Documentação — Pitiupi
Entrada na raiz do repositório: [README.md](../README.md). Entrada no repositório: [README.md](../README.md) (quickstart e comandos).
Convenções editoriais: [documentation/00_convencoes.md](documentation/00_convencoes.md).
## Pilares ## Pilares
| Pasta / arquivo | Papel | | Pasta / arquivo | Papel |
| --- | --- | | --- | --- |
| **[documentation/](documentation/README.md)** | Código, rede, plugins, operação e guia para alunos | | **[documentation/](documentation/README.md)** | Código, rede, plugins, operação e tutoriais |
| **[references/](references/README.md)** | Bibliografia e notas de conceitos (UDP, TCP, SPI) | | **[references/](references/README.md)** | Bibliografia e notas (UDP, TCP, SPI, multicast) |
| **[decision-register.md](decision-register.md)** | Decisões de desenho da plataforma | | **[decision-register.md](decision-register.md)** | Decisões de desenho da plataforma |
## Público-alvo ## Jornadas
| Leitor | Começar por | | Leitor | Trilha |
| --- | --- | | --- | --- |
| **Aluno (TP)** | [documentation/00_quickstart.md](documentation/00_quickstart.md) → [10_tutorial_plugin.md](documentation/10_tutorial_plugin.md) → [17_tutorial_ping_aula.md](documentation/17_tutorial_ping_aula.md) → [11_plugins_referencia.md](documentation/11_plugins_referencia.md) | | **Aluno (TP)** | [00_quickstart](documentation/00_quickstart.md) → [09_sistema_de_plugins](documentation/09_sistema_de_plugins.md) → [10_tutorial_plugin](documentation/10_tutorial_plugin.md) → [17_tutorial_ping_aula](documentation/17_tutorial_ping_aula.md) → [11_plugins_referencia](documentation/11_plugins_referencia.md) |
| **Monitor / docência** | [documentation/01_visao_disciplina_e_tp.md](documentation/01_visao_disciplina_e_tp.md) → [15_testes_e_gate.md](documentation/15_testes_e_gate.md) | | **Redes (conceito + código)** | [16_fundamentacao_redes](documentation/16_fundamentacao_redes.md) → [05](documentation/05_udp_multicast.md)–[08](documentation/08_heartbeat_e_presenca.md) → [appendix_portas_e_multicast](documentation/appendix_portas_e_multicast.md) |
| **Desenvolvedor** | [documentation/13_guia_desenvolvimento.md](documentation/13_guia_desenvolvimento.md) → [14_arquitetura_e_manutencao.md](documentation/14_arquitetura_e_manutencao.md) | | **Monitor / docência** | [01_visao_disciplina_e_tp](documentation/01_visao_disciplina_e_tp.md) → [15_testes_e_gate](documentation/15_testes_e_gate.md) |
| **Professor / banca** | [documentation/16_fundamentacao_redes.md](documentation/16_fundamentacao_redes.md) → [references/README.md](references/README.md) | | **Desenvolvedor núcleo** | [13_guia_desenvolvimento](documentation/13_guia_desenvolvimento.md) → [14_arquitetura_e_manutencao](documentation/14_arquitetura_e_manutencao.md) → [04_inicializacao_e_gui](documentation/04_inicializacao_e_gui.md) |
**Idioma:** documentação em PT-BR; pacotes e classes Java como no código. ## Manutenção rápida
## Manutenção | Mudança | Onde documentar |
| Tipo de mudança | Onde documentar |
| --- | --- | | --- | --- |
| Protocolo UDP/TCP, multicast, portas | [documentation/05_udp_multicast.md](documentation/05_udp_multicast.md), [06_tcp_conexoes.md](documentation/06_tcp_conexoes.md), [appendix_portas_e_multicast.md](documentation/appendix_portas_e_multicast.md) | | UDP/TCP, multicast, portas | 05, 06, appendix |
| Contrato de plugin / SPI | [documentation/09_sistema_de_plugins.md](documentation/09_sistema_de_plugins.md), [10_tutorial_plugin.md](documentation/10_tutorial_plugin.md) | | SPI / plugins | 09, 10 |
| Novo plugin de referência | [documentation/11_plugins_referencia.md](documentation/11_plugins_referencia.md) | | Decisão de arquitetura | decision-register |
| Decisão de arquitetura | [decision-register.md](decision-register.md) | | Débito técnico | engineering_backlog |
| Débito técnico | [documentation/engineering_backlog.md](documentation/engineering_backlog.md) |
| Literatura de redes | [references/](references/) |
Documentação legada em `pitiupi/docs/` redireciona para esta árvore.
+32
View File
@@ -0,0 +1,32 @@
# Convenções da documentação
Índice geral: [docs/README.md](../README.md).
## Idioma e tom
- Português brasileiro, termos de Redes e Java como no código (`ConnectionManager`, `MulticastSocket`).
- Parágrafos completos; evitar listas longas quando um texto curto explica melhor.
## Blocos teoria × implementação
Em capítulos de rede e arquitetura, quando um conceito for central, use mentalmente três camadas:
1. **Teoria** — como o protocolo ou padrão funciona em geral (com link para [references/README.md](../references/README.md) se precisar de fonte).
2. **No Pitiupi** — classes e fluxo reais.
3. **Limitação** — o que o projeto **não** faz (ex.: sem criptografia, sem ICMP nativo no plugin Ping).
Não descreva funcionalidade futura como se já existisse.
## Código nos exemplos
- Trechos de tutorial são **ilustrativos** quando indicado; o aluno completa o plugin (ver [17_tutorial_ping_aula.md](17_tutorial_ping_aula.md)).
- APIs citadas devem existir no núcleo atual (`PluginWorkspace`, `createPlugin(ConnectionManager, PluginWorkspace)`).
## Diagramas
- Preferir [Mermaid](https://github.blog/2014-02-14-render-diagrams-markdown/) em arquivos `.md` (GitHub).
- Diagramas pequenos, um fluxo por figura.
## Manutenção
Alterou protocolo, SPI ou boot? Atualize o capítulo numerado correspondente e, se for decisão estável, [decision-register.md](../decision-register.md). Ver [13_guia_desenvolvimento.md](13_guia_desenvolvimento.md).
+58 -22
View File
@@ -62,7 +62,7 @@ A interface gráfica é Swing, organizada em shell (`pitiupi.presentation.shell`
| Região | Componente | | Região | Componente |
|--------|------------| |--------|------------|
| Centro | `TabWorkspacePanel` — aba **Plugins** (galeria; abre plugin sob demanda), abas de plugin **fecháveis** (×), aba **Configurações** | | Centro | `TabWorkspacePanel` — aba **Plugins** (galeria; abre plugin sob demanda), abas de plugin **fecháveis** (×), aba **Configurações** |
| Leste | `NetworkUsersPanel` — “Usuários nesta rede”, badges de convite, peer actions | | Leste | `NetworkUsersPanel` — “Usuários nesta rede”, peer actions (badges na lista: **D23**, adiados — ver [decision-register.md](../decision-register.md)) |
| Sul | Barra de status (porta e nome local) | | Sul | Barra de status (porta e nome local) |
| Menu | `ShellMenuBar` — apenas **Ajuda → Sobre** (sair pelo X da janela) | | Menu | `ShellMenuBar` — apenas **Ajuda → Sobre** (sair pelo X da janela) |
@@ -77,7 +77,7 @@ Ao iniciar, só as abas **Plugins** e **Configurações** ficam visíveis. Cada
O **chat** usa campo de mensagem compacto (~2 linhas, quebra de linha; barra de rolagem vertical só se o texto não couber). O histórico ocupa a maior parte da altura da aba (divisor proporcional ao abrir a janela). O **chat** usa campo de mensagem compacto (~2 linhas, quebra de linha; barra de rolagem vertical só se o texto não couber). O histórico ocupa a maior parte da altura da aba (divisor proporcional ao abrir a janela).
Canal TCP privado do chat fica no mesmo `ChatPanel` (histórico separado por conversa: sala geral, peer por IP, privado com toggle). A lista lateral usa `PeerActivityInbox` (bolinha vermelha e contagem; no menu, ● na ação correspondente). Canal TCP privado do chat fica no mesmo `ChatPanel` (histórico separado por conversa: sala geral, peer por IP, privado com toggle). O núcleo mantém `PeerActivityInbox` para atividade por peer; indicadores visuais completos na lista lateral ainda não fazem parte da v1 (**D23**).
Ao fechar a aba superior de **Compartilhar tela** (×), o núcleo chama `Plugin.onShellTabClosed()` — o plugin interrompe captura e envio (toggle desligado). Reabrir pela galeria deve mostrar compartilhamento inativo. Ao fechar a aba superior de **Compartilhar tela** (×), o núcleo chama `Plugin.onShellTabClosed()` — o plugin interrompe captura e envio (toggle desligado). Reabrir pela galeria deve mostrar compartilhamento inativo.
@@ -87,30 +87,66 @@ Textos da UI (destino, combo de forma de envio e linha **“Como esta mensagem v
Ver [12_menus_unicast_multicast.md](12_menus_unicast_multicast.md). Ver [12_menus_unicast_multicast.md](12_menus_unicast_multicast.md).
## Diagrama de comunicação ## Boot (sequência)
```mermaid
sequenceDiagram
participant Main
participant Home as PitiupiHome
participant Login as LoginDialog
participant Shell as MainShellFrame
participant CM as ConnectionManager
participant PM as PluginManager
Main->>Home: ensureLayout()
Main->>Login: showLogin()
Login-->>Main: nome + porta
Main->>Shell: new MainShellFrame(nome, porta)
Shell->>CM: iniciar UDP/TCP/heartbeat
Shell->>PM: carregar JARs SPI
PM-->>Shell: createPlugin(cm, workspace)
``` ```
+------------------+
| MainShellFrame | ## Camadas de comunicação
+--------+---------+
| ```mermaid
+--------------------+--------------------+ flowchart TB
| | | subgraph ui [presentation.shell]
v v v Shell[MainShellFrame]
HeartbeatManager SocketUDP SocketTCP Users[NetworkUsersPanel]
| | | end
v v v subgraph app [application + control]
Heartbeat UDP Multicast TCP Connections CM[ConnectionManager]
| | HB[HeartbeatManager]
+---------+----------+ Disp[MessageDispatcher]
| end
v subgraph net [net]
Plugins UDP[SocketUDP]
| TCP[SocketTCP]
v end
Message subgraph ext [plugins]
PL[Plugin JARs]
end
Shell --> CM
Users --> CM
CM --> UDP
CM --> TCP
CM --> HB
Disp --> CM
PL --> Disp
UDP --> PL
TCP --> PL
``` ```
O UDP multicast sustenta presença e mensagens broadcast/unicast; o TCP sustenta O UDP multicast sustenta presença e mensagens broadcast/unicast; o TCP sustenta
canais diretos com framing de mensagens. Detalhes em [05](05_udp_multicast.md) canais diretos com framing de mensagens. Detalhes em [05](05_udp_multicast.md)
e [06](06_tcp_conexoes.md). e [06](06_tcp_conexoes.md).
### Exemplo: um envio UDP até outro peer
1. Plugin chama `MessageDispatcher` (ou `ConnectionManager`) com `TransportMode` e destino.
2. Mensagem serializada (`Message.toByteArray()`).
3. `SocketUDP` monta `DatagramPacket` (multicast `224.0.0.3` ou unicast ao IP do peer).
4. Peer receptor: thread de `SocketUDP.receive()` desserializa e `PluginManager` entrega ao plugin que declarou o tipo em `getMessages()`.
Ver [07_mensagens_e_serializacao.md](07_mensagens_e_serializacao.md).
+29 -1
View File
@@ -1,5 +1,6 @@
# Comunicação UDP # Comunicação UDP
**Teoria:** UDP envia datagramas sem conexão; multicast replica um pacote na LAN para todos os membros do grupo. **No Pitiupi:** presença e muitas mensagens de plugins usam o mesmo `MulticastSocket` na porta do login. **Limitação:** sem garantia de entrega nem ordem — plugins com imagens grandes devem considerar perda e MTU.
A classe `SocketUDP` é responsável pela comunicação UDP da aplicação. A classe `SocketUDP` é responsável pela comunicação UDP da aplicação.
@@ -20,7 +21,7 @@ O SocketUDP suporta dois modos de envio:
Durante sua inicialização, o `SocketUDP`: Durante sua inicialização, o `SocketUDP`:
1. obtém o endereço do grupo multicast; 1. obtém o endereço do grupo multicast;
2. cria um `MulticastSocket` utilizando a porta configurada na `MainWindow`; 2. cria um `MulticastSocket` na **porta escolhida no login** (mesma porta TCP da sala);
3. configura os buffers de envio e recepção; 3. configura os buffers de envio e recepção;
4. habilita o reuso do endereço; 4. habilita o reuso do endereço;
5. ingressa no grupo multicast. 5. ingressa no grupo multicast.
@@ -83,3 +84,30 @@ do grupo multicast e fecha o `MulticastSocket`.
A variável `running` é utilizada para sinalizar que o processo de recepção deve ser A variável `running` é utilizada para sinalizar que o processo de recepção deve ser
encerrado. encerrado.
### Interface de rede
`LocalNetworkInfo.preferredNetworkInterface()` escolhe a interface para o multicast: **Ethernet antes de Wi‑Fi**; em cabo APIPA (`169.254.*`) prioriza esse endereço. Em sala **só Wi‑Fi**, a interface wireless é usada normalmente. Requisito: peers na **mesma sub-rede** e multicast permitido — ver [appendix_portas_e_multicast.md](appendix_portas_e_multicast.md).
### Sequência didática (plugin → peer B)
```mermaid
sequenceDiagram
participant UI as Plugin_UI
participant Disp as MessageDispatcher
participant CM as ConnectionManager
participant UDP as SocketUDP
participant LAN as LAN_UDP
participant UDPb as SocketUDP_peerB
participant PM as PluginManager_peerB
UI->>Disp: enviar Message + modo + destino
Disp->>CM: send UDP
CM->>UDP: sendUnicast ou sendMulticast
UDP->>LAN: DatagramPacket
LAN->>UDPb: receive
UDPb->>PM: byte[] desserializado
PM->>UI: receiveMessage no plugin
```
**Falhas comuns:** firewall bloqueando UDP na porta do login; portas diferentes entre peers; isolamento de clientes no Wi‑Fi; WSL num lado e Windows nativo no outro.
+22 -11
View File
@@ -1,7 +1,8 @@
# Comunicação TCP # Comunicação TCP
**Teoria:** TCP oferece fluxo confiável e ordenado entre dois sockets; a aplicação ainda precisa definir **limites de mensagem**. **No Pitiupi:** framing `int` tamanho + bytes serializados. **Limitação:** uma conexão por endereço IP de peer no mapa gerenciado por `TcpConnectionManager`.
A comunicação TCP é implementada pela classe `SocketTCP`. A comunicação TCP é implementada principalmente por `SocketTCP`, com o mapa de conexões em `TcpConnectionManager`.
Diferentemente do UDP, o TCP estabelece conexões entre dois peers. Essas conexões Diferentemente do UDP, o TCP estabelece conexões entre dois peers. Essas conexões
são mantidas enquanto forem necessárias e podem ser reutilizadas para o envio de são mantidas enquanto forem necessárias e podem ser reutilizadas para o envio de
@@ -9,12 +10,7 @@ múltiplas mensagens.
A arquitetura utiliza uma conexão TCP persistente por endereço de peer. A arquitetura utiliza uma conexão TCP persistente por endereço de peer.
O SocketTCP possui um mapa de conexões: O `TcpConnectionManager` mantém um mapa `InetAddress` → `TcpConnection`, permitindo reutilizar a mesma conexão para vários envios ao mesmo peer.
`InetAddress` -> `TcpConnection`
Esse mapa permite localizar rapidamente uma conexão existente para determinado peer e
reutilizá-la durante novos envios.
### SocketTCP ### SocketTCP
@@ -85,11 +81,9 @@ SocketTCP
Dessa forma, uma conexão bloqueada ou aguardando dados não impede que outras conexões Dessa forma, uma conexão bloqueada ou aguardando dados não impede que outras conexões
continuem sendo processadas. continuem sendo processadas.
Quando uma mensagem é recebida por uma `TcpConnection`, ela é encaminhada para todos os Quando uma mensagem é recebida por uma `TcpConnection`, ela é encaminhada ao `PluginManager`, que despacha para os plugins cujo `getMessages()` inclui o tipo.
plugins registrados na `MainWindow`.
O plugin responsável pela funcionalidade deve identificar o tipo da mensagem e O plugin identifica o tipo em `receiveMessage()` e processa na thread adequada (UI via `SwingUtilities.invokeLater` quando necessário).
realizar o processamento correspondente.
### TcpConnection ### TcpConnection
@@ -190,3 +184,20 @@ v
| |
+---- peer inativo ----> fecha conexão +---- peer inativo ----> fecha conexão
``` ```
```mermaid
sequenceDiagram
participant Sender as TcpConnection_envio
participant Stream as DataOutputStream
participant Net as TCP
participant Recv as TcpConnection_recepção
Sender->>Stream: writeInt(tamanho)
Sender->>Stream: write(bytes)
Stream->>Net: fluxo de bytes
Net->>Recv: readInt()
Recv->>Recv: readFully(N bytes)
Recv->>Recv: PluginManager.dispatch
```
Quando usar TCP no Pitiupi: chat e screencast oferecem TCP na UI; presença continua em UDP. Compare com [05_udp_multicast.md](05_udp_multicast.md) e [16_fundamentacao_redes.md](16_fundamentacao_redes.md).
@@ -16,3 +16,18 @@ comportamentos necessários para cada funcionalidade.
A camada de transporte não depende do conteúdo específico das mensagens. Tanto o A camada de transporte não depende do conteúdo específico das mensagens. Tanto o
UDP quanto o TCP recebem mensagens serializadas como `byte[]`. UDP quanto o TCP recebem mensagens serializadas como `byte[]`.
## Despacho aos plugins
1. **Registro:** cada plugin declara `List<Class<? extends Message>> getMessages()`.
2. **Recepção UDP:** `SocketUDP` entrega bytes ao `PluginManager`, que usa `PluginObjectInputStream` com o classloader do JAR do plugin.
3. **Recepção TCP:** `TcpConnection` lê um frame completo e o `PluginManager` tenta o mesmo despacho.
4. **Tipos desconhecidos:** se nenhum plugin reconhece, a mensagem é ignorada (sem crash do núcleo).
Mensagens de infraestrutura (`HeartbeatMessage`, `GoodbyeMessage`, etc.) são tratadas no núcleo antes ou em paralelo ao despacho de plugins — ver [08_heartbeat_e_presenca.md](08_heartbeat_e_presenca.md).
## Riscos da desserialização Java
Peers devem usar **mesma versão** das classes de mensagem. JARs de plugins devem vir de fonte confiável (instalação local pelo usuário). O núcleo **não** implementa sandbox de desserialização — ver [09_sistema_de_plugins.md](09_sistema_de_plugins.md).
Notas: [references/notas/java_serializacao.md](../references/notas/java_serializacao.md).
+24 -1
View File
@@ -1,4 +1,6 @@
# Heartbeat # Heartbeat e presença
**Presença ≠ conexão TCP:** ver um peer na lista lateral significa que heartbeats UDP recentes foram recebidos; ainda assim o primeiro envio TCP pode abrir um novo socket.
### Heartbeat ### Heartbeat
@@ -60,3 +62,24 @@ Lista de peers ativos
| |
+----> Plugins (PeerListener) +----> Plugins (PeerListener)
``` ```
### Parâmetros práticos
| Item | Valor no núcleo | Efeito na sala |
| --- | --- | --- |
| Grupo multicast | `224.0.0.3` | Todos na mesma porta participam |
| Intervalo de envio | ~5 s | Lista atualiza em alguns segundos |
| Timeout de ausência | ~15 s | Peer some após queda ou fechamento sem goodbye |
| Goodbye | multicast ao sair | Remove peer mais rápido que só timeout |
Em **Wi‑Fi de laboratório**, heartbeat usa o mesmo multicast que o chat na sala geral — mesma porta no login, mesma sub-rede, sem isolamento AP→AP. Checklist: [appendix_portas_e_multicast.md](appendix_portas_e_multicast.md).
```mermaid
flowchart LR
HM[HeartbeatManager] -->|HeartbeatMessage| UDP[SocketUDP multicast]
UDP --> LAN[LAN]
LAN --> UDP2[SocketUDP outro peer]
UDP2 --> HM2[HeartbeatManager]
HM2 --> PS[PresenceService]
PS --> UI[NetworkUsersPanel]
```
+60 -31
View File
@@ -1,14 +1,27 @@
# Tutorial — criar um plugin # Tutorial — criar um plugin
Este guia complementa [09_sistema_de_plugins.md](09_sistema_de_plugins.md). Use `plugins/chat` como modelo. Complementa [09_sistema_de_plugins.md](09_sistema_de_plugins.md). Exercício guiado completo: [17_tutorial_ping_aula.md](17_tutorial_ping_aula.md). Use `plugins/chat` como **modelo de estrutura** (Ant, SPI, painel).
Os exemplos abaixo são **parciais** — você completa métodos, UI e testes.
## Verificações progressivas
| Etapa | O que fazer | Sucesso | Erro comum |
| --- | --- | --- | --- |
| Projeto Ant | Copiar `plugins/chat` → `plugins/meuPlugin`, ajustar JAR | `ant jar` OK | Classpath sem `pitiupi.jar` |
| Classe `Plugin` | Estender `Plugin`, metadados | Compila | `createPlugin` com assinatura antiga |
| SPI | `META-INF/services/pitiupi.models.Plugin` | Classe listada no JAR | Arquivo fora de `src/` |
| Mensagem | Uma classe `extends Message` | Em `getMessages()` | Tipo não registrado → ignorado na rede |
| Instalação | JAR em `PITIUPI_HOME/plugins` + reinício | Plugin na galeria | Esqueceu reiniciar |
| Rede | Duas instâncias, portas diferentes | Peer na lista | Portas iguais no mesmo PC ou firewall |
## 1. Novo projeto ## 1. Novo projeto
- Copie a pasta `plugins/chat` para `plugins/meuPlugin` (nome à escolha). - Copie `plugins/chat` para `plugins/meuPlugin`.
- Ajuste `project.properties` / `build.xml` com o nome do JAR de saída. - Ajuste `project.properties` / `build.xml` com o nome do JAR (`dist/pitiupi.meuplugin.jar`).
- Mantenha `javac.classpath` apontando para `../pitiupi/dist/pitiupi.jar`. - `javac.classpath` → `../../pitiupi/dist/pitiupi.jar` (ou caminho equivalente).
## 2. Classe principal ## 2. Classe principal (trecho)
```java ```java
public class MeuPlugin extends Plugin { public class MeuPlugin extends Plugin {
@@ -39,56 +52,72 @@ public class MeuPlugin extends Plugin {
@Override @Override
public void receiveMessage(Message message) { public void receiveMessage(Message message) {
if (message instanceof MinhaMessage m) { /* ... */ } if (message instanceof MinhaMessage m) {
// atualizar UI com SwingUtilities.invokeLater quando necessário
}
} }
// getName, getAuthor, getVersion, getIdentifier
} }
``` ```
## 3. Mensagem Implemente `getName()`, `getAuthor()`, `getVersion()`, `getIdentifier()` (identificador único na sala).
## 3. Mensagem e envio
```java ```java
public class MinhaMessage extends Message implements Serializable { public class MinhaMessage extends Message implements Serializable {
// campos + serialVersionUID recomendado private static final long serialVersionUID = 1L;
private final String texto;
// construtor, getters
} }
``` ```
Envio típico via `ConnectionManager` (multicast ou unicast UDP, ou TCP conforme o caso). Envio típico via `MessageDispatcher` (modo `TransportMode` + destino). Exemplo conceitual:
## 4. Service Provider Interface ```java
// dentro do painel ou controller, com ConnectionManager injetado:
dispatcher.send(minhaMsg, TransportMode.UNICAST_UDP, SendTarget.forPeer(ip));
```
Arquivo `src/META-INF/services/pitiupi.models.Plugin`: Detalhes: [07_mensagens_e_serializacao.md](07_mensagens_e_serializacao.md), [12_menus_unicast_multicast.md](12_menus_unicast_multicast.md).
## 4. SPI
`src/META-INF/services/pitiupi.models.Plugin`:
``` ```
pacote.MeuPlugin pacote.MeuPlugin
``` ```
## 5. Registrar no catálogo Confirme com `jar tf dist/seu.jar | grep META-INF/services`.
Adicione uma entrada em [`plugins.registry.json`](../../plugins.registry.json): ## 5. Catálogo (opcional para TP)
```json Para build com `./scripts/pitiupi.sh`, adicione entrada em [`plugins.registry.json`](../../plugins.registry.json). Exercícios locais podem instalar só o JAR pela aba **Configurações**.
{
"id": "xadrez",
"dir": "pitiupi.xadrez",
"build": "ant",
"jar": "dist/pitiupi.xadrez.jar",
"menuCategory": "Jogos"
}
```
O `id` é o que você passa para `./scripts/pitiupi.sh run --plugins xadrez`.
## 6. Build e instalação ## 6. Build e instalação
```bash ```bash
./scripts/pitiupi.sh build --plugins xadrez cd plugins/meuPlugin && ant jar
# copiar ou Instalar JAR… na UI; reiniciar o app
``` ```
JARs de runtime ficam em `PITIUPI_HOME/plugins` (ver [00_quickstart.md](00_quickstart.md)). ## 7. Dois cenários de teste
## 7. Próximos passos **A — Mesmo computador:** duas instâncias, portas `5000` e `5001`, nomes distintos, mesma versão do JAR.
- [11_plugins_referencia.md](11_plugins_referencia.md) — chat e screenCast **B — Dois PCs:** mesma porta (ex. `5000`), mesma sub-rede Wi‑Fi ou cabo, firewall UDP/TCP liberado, mesmo plugin instalado. Ver [appendix_portas_e_multicast.md](appendix_portas_e_multicast.md).
- [17_tutorial_ping_aula.md](17_tutorial_ping_aula.md) — plugin didático Ping (opcional, fora do commit)
## Problemas comuns
| Sintoma | Causa provável | O que fazer |
| --- | --- | --- |
| Plugin não aparece | SPI ausente ou sem reinício | Verificar JAR, reiniciar |
| `ClassNotFoundException` na rede | Classe de mensagem não em `getMessages()` ou JAR diferente no peer | Alinhar tipos e reinstalar nos dois |
| Peers não se veem | Porta/sub-rede/multicast | Appendix Wi‑Fi |
| UI não atualiza | Rede na EDT | `SwingUtilities.invokeLater` |
| TCP falha | Peer offline ou IP errado | Conferir lista lateral e `PeerIpv4` |
## Próximos passos
- [17_tutorial_ping_aula.md](17_tutorial_ping_aula.md) — exercício Ping (RTT, UDP)
- [11_plugins_referencia.md](11_plugins_referencia.md) — chat e screencast
+27 -7
View File
@@ -15,16 +15,36 @@ Dois módulos buildáveis no catálogo; o chat unifica o antigo mpChat (multicas
## plugins/chat ## plugins/chat
- Sala geral ou um peer (lista + IP). Fluxo resumido:
- Transportes: multicast UDP, unicast UDP, TCP via `MessageDispatcher`.
- Peer actions: abrir sala geral; conversar com peer; canal TCP privado. 1. `ChatPlugin.createPlugin` registra `ChatPanel` e peer actions (sala, peer, TCP privado).
- Caminho: `plugins/chat/src/pitiupi/chat/plugin/ChatPlugin.java`. 2. Envio: usuário escolhe destino e `TransportMode` → `MessageDispatcher` → UDP ou TCP do núcleo.
3. Recepção: `ChatMessage` em `receiveMessage` → histórico na aba correta (sala, IP ou canal privado).
4. TCP privado: toggle desliga o combo de transporte e usa bytes dedicados ao plugin.
Código de entrada: `plugins/chat/src/pitiupi/chat/plugin/ChatPlugin.java`.
```mermaid
flowchart LR
UI[ChatPanel] --> Disp[MessageDispatcher]
Disp --> CM[ConnectionManager]
CM --> Net[UDP ou TCP]
Net --> CM2[ConnectionManager peer]
CM2 --> CP[ChatPlugin.receiveMessage]
CP --> UI2[ChatPanel peer]
```
## plugins/screencast ## plugins/screencast
- Compartilhamento contínuo com destino geral (multicast recomendado) ou um peer (unicast/TCP). Fluxo resumido:
- Peer actions: compartilhar na rede; compartilhar com este peer.
- Caminho: `plugins/screencast/src/pitiupi/screenCast/plugin/ScreenCastPlugin.java`. 1. Captura de tela em loop (com throttling) → `ScreenCastMessage` com imagem serializada.
2. Destino geral: multicast; um peer: unicast/TCP conforme painel.
3. `SessionNoticeMessage` (núcleo) marca início/fim de sessão para fechar abas de recepção.
Código de entrada: `plugins/screencast/src/pitiupi/screenCast/plugin/ScreenCastPlugin.java`.
**Limitação:** largura de banda e MTU — frames grandes podem sofrer perda em UDP; adequado para demonstração, não para produção.
## Exercício Ping ## Exercício Ping
@@ -1,4 +1,4 @@
# Menus e ações na lista (histórico) # Transporte na UI e peer actions
Na v1 atual, plugins **não** registram menus na barra superior nem submenus legados por categoria. Na v1 atual, plugins **não** registram menus na barra superior nem submenus legados por categoria.
@@ -31,6 +31,22 @@ Ou na raiz: `./scripts/pitiupi.sh build --all`.
Testes manuais em rede: [15_testes_e_gate.md](15_testes_e_gate.md). Testes manuais em rede: [15_testes_e_gate.md](15_testes_e_gate.md).
## Documentação viva
Ao alterar comportamento visível ou protocolo:
| Mudou | Atualizar |
| --- | --- |
| Boot, shell, abas | `04`, `14` |
| UDP/multicast/portas | `05`, `appendix` |
| TCP/framing | `06` |
| Mensagens/despacho | `07` |
| Heartbeat/presença | `08`, `decision-register` se constante |
| SPI / API plugin | `09`, `10` |
| Plugin de referência | `11` |
Convenções de escrita: [00_convencoes.md](00_convencoes.md).
## Convenções ## Convenções
- Código e identificadores em inglês (pacotes `pitiupi.*`). - Código e identificadores em inglês (pacotes `pitiupi.*`).
@@ -1,5 +1,38 @@
# Arquitetura e manutenção # Arquitetura e manutenção
## Visão em camadas
```mermaid
flowchart TB
subgraph presentation [presentation.shell]
Login[LoginDialog]
Shell[MainShellFrame]
end
subgraph control [control]
CM[ConnectionManager]
HB[HeartbeatManager]
PM[PluginManager]
end
subgraph application [application]
Disp[MessageDispatcher]
Presence[PresenceService]
end
subgraph netlayer [net]
UDP[SocketUDP]
TCP[SocketTCP]
end
Login --> Shell
Shell --> CM
CM --> UDP
CM --> TCP
CM --> HB
CM --> PM
PM --> Disp
HB --> Presence
```
Boot detalhado: [04_inicializacao_e_gui.md](04_inicializacao_e_gui.md).
## Onde editar ## Onde editar
| Comportamento | Pacote / classe | | Comportamento | Pacote / classe |
@@ -45,8 +45,20 @@ SPI e classloader por JAR — padrão de plug-in em aplicações Java.
Doc: [09_sistema_de_plugins.md](09_sistema_de_plugins.md). Doc: [09_sistema_de_plugins.md](09_sistema_de_plugins.md).
## Quando o Pitiupi usa cada transporte
| Situação | Transporte típico | Motivo |
| --- | --- | --- |
| Lista de usuários / heartbeat | UDP multicast | Todos os peers sem conexão prévia |
| Sala geral (chat, ping broadcast) | UDP multicast ou cópias unicast/TCP conforme combo | Didático: aluno vê diferença na UI |
| Mensagem para um IP | UDP unicast ou TCP | Destino explícito |
| Fluxo contínuo (tela, TCP privado chat) | TCP | Fluxo e framing no núcleo |
UDP não é “sempre mais rápido” nem TCP “resolve tudo”: perda e ordem ainda importam na aplicação; TCP adiciona handshake e estado por peer.
## Leitura complementar ## Leitura complementar
- [references/notas/udp_vs_tcp.md](../references/notas/udp_vs_tcp.md) - [references/notas/udp_vs_tcp.md](../references/notas/udp_vs_tcp.md)
- [references/README.md](../references/README.md) (bibliografia)
- [references/notas/multicast_lan.md](../references/notas/multicast_lan.md) - [references/notas/multicast_lan.md](../references/notas/multicast_lan.md)
- [references/notas/java_spi_plugins.md](../references/notas/java_spi_plugins.md) - [references/notas/java_spi_plugins.md](../references/notas/java_spi_plugins.md)
+12 -1
View File
@@ -2,7 +2,7 @@
Exercício para montar o plugin **mais simples** do Pitiupi: medir **RTT** (tempo de ida e volta) com mensagens `Ping` / `Pong` na rede, igual a um `ping` de laboratório — mas usando o **mesmo mecanismo de plugins** do chat e do screencast. Exercício para montar o plugin **mais simples** do Pitiupi: medir **RTT** (tempo de ida e volta) com mensagens `Ping` / `Pong` na rede, igual a um `ping` de laboratório — mas usando o **mesmo mecanismo de plugins** do chat e do screencast.
A solução Java **não** entra no Git: só este tutorial e [`plugins/ping/README.md`](../../plugins/ping/README.md). O professor valida localmente; o aluno implementa no próprio `plugins/ping/` (gitignored). A solução completa **não** entra no repositório público: o aluno desenvolve em `plugins/ping/` na máquina local (fora do gate CI). Este tutorial traz escopo, trechos e verificações — você implementa o restante.
Índice: [README.md](README.md) · Plugins de referência: [11_plugins_referencia.md](11_plugins_referencia.md). Índice: [README.md](README.md) · Plugins de referência: [11_plugins_referencia.md](11_plugins_referencia.md).
@@ -133,6 +133,17 @@ Instalação usa o mesmo `PluginStore` da aba **Configurações** (`installFromF
O chat usa a mesma ideia de abas de sessão, mas adiciona roteamento TCP privado e HTML. No Ping mantenha **só** UDP e texto em `JTextArea` — ideal para entender o fluxo antes de copiar padrões para um plugin novo. O chat usa a mesma ideia de abas de sessão, mas adiciona roteamento TCP privado e HTML. No Ping mantenha **só** UDP e texto em `JTextArea` — ideal para entender o fluxo antes de copiar padrões para um plugin novo.
## Problemas comuns (Ping)
| Sintoma | Diagnóstico |
| --- | --- |
| RTT não aparece | `Pong` sem `pingId` correspondente em `pendingByPingId` |
| Peer não recebe | Tipo não listado em `getMessages()` ou UDP bloqueado |
| `ClassCastException` | Versões diferentes do JAR entre PCs |
| Aba não abre | Esqueceu `bindShellWorkspaceContent` ou peer action só abre UI (envio é no painel) |
Mais geral: [10_tutorial_plugin.md](10_tutorial_plugin.md#problemas-comuns).
## Checklist do aluno ## Checklist do aluno
- [ ] SPI e `getIdentifier` únicos - [ ] SPI e `getIdentifier` únicos
+19 -21
View File
@@ -1,28 +1,26 @@
# Documentação técnica — Pitiupi # Documentação técnica — Pitiupi
Referência para **código Java**, **rede P2P** e **plugins**. Índice geral: [docs/README.md](../README.md). Índice geral: [docs/README.md](../README.md) · Convenções: [00_convencoes.md](00_convencoes.md).
## Ordem sugerida ## Por área
| Área | Arquivos |
| --- | --- |
| **Início** | [00_quickstart](00_quickstart.md), [01_visao_disciplina_e_tp](01_visao_disciplina_e_tp.md), [02_modulos](02_modulos_do_repositorio.md), [03_build](03_build_ant_netbeans.md) |
| **Arquitetura e GUI** | [04_inicializacao_e_gui](04_inicializacao_e_gui.md), [13_guia_desenvolvimento](13_guia_desenvolvimento.md), [14_arquitetura_e_manutencao](14_arquitetura_e_manutencao.md) |
| **Rede** | [05_udp_multicast](05_udp_multicast.md), [06_tcp_conexoes](06_tcp_conexoes.md), [07_mensagens](07_mensagens_e_serializacao.md), [08_heartbeat](08_heartbeat_e_presenca.md), [16_fundamentacao_redes](16_fundamentacao_redes.md), [appendix_portas_e_multicast](appendix_portas_e_multicast.md) |
| **Plugins** | [09_sistema_de_plugins](09_sistema_de_plugins.md), [10_tutorial_plugin](10_tutorial_plugin.md), [17_tutorial_ping_aula](17_tutorial_ping_aula.md), [11_plugins_referencia](11_plugins_referencia.md), [12_transporte_e_peer_actions](12_menus_unicast_multicast.md) |
| **Qualidade** | [15_testes_e_gate](15_testes_e_gate.md), [engineering_backlog](engineering_backlog.md) |
## Ordem linear (referência)
| # | Arquivo | Conteúdo | | # | Arquivo | Conteúdo |
| --- | --- | --- | | --- | --- | --- |
| 0 | [00_quickstart.md](00_quickstart.md) | Build, plugins, duas instâncias | | 0 | [00_quickstart.md](00_quickstart.md) | Build, plugins, duas instâncias |
| 1 | [01_visao_disciplina_e_tp.md](01_visao_disciplina_e_tp.md) | Uso na disciplina e trabalho prático | | 1–3 | 01–03 | Disciplina, módulos, Ant |
| 2 | [02_modulos_do_repositorio.md](02_modulos_do_repositorio.md) | Núcleo e três plugins de referência | | 4 | [04_inicializacao_e_gui.md](04_inicializacao_e_gui.md) | Boot, `MainShellFrame`, shell Swing |
| 3 | [03_build_ant_netbeans.md](03_build_ant_netbeans.md) | Ant e NetBeans (núcleo + plugins) | | 5–8 | 05–08 | UDP, TCP, mensagens, presença |
| 4 | [04_inicializacao_e_gui.md](04_inicializacao_e_gui.md) | Boot, MainWindow, diagrama | | 9–12 | 09–12 | Plugins, tutoriais, transporte na UI |
| 5 | [05_udp_multicast.md](05_udp_multicast.md) | SocketUDP | | 13–15 | 13–15 | Dev, manutenção, testes |
| 6 | [06_tcp_conexoes.md](06_tcp_conexoes.md) | SocketTCP, TcpConnection, framing | | 16–17 | 16–17 | Fundamentação redes, exercício Ping |
| 7 | [07_mensagens_e_serializacao.md](07_mensagens_e_serializacao.md) | Classe Message | | — | [appendix_portas_e_multicast.md](appendix_portas_e_multicast.md) | Portas, Wi‑Fi, WSL |
| 8 | [08_heartbeat_e_presenca.md](08_heartbeat_e_presenca.md) | HeartbeatManager |
| 9 | [09_sistema_de_plugins.md](09_sistema_de_plugins.md) | Plugin, PluginManager, SPI |
| 10 | [10_tutorial_plugin.md](10_tutorial_plugin.md) | Passo a passo novo plugin |
| 11 | [11_plugins_referencia.md](11_plugins_referencia.md) | chat e screencast |
| 17 | [17_tutorial_ping_aula.md](17_tutorial_ping_aula.md) | Exercício Ping (aula) |
| 12 | [12_menus_unicast_multicast.md](12_menus_unicast_multicast.md) | MenuCategory e ações |
| 13 | [13_guia_desenvolvimento.md](13_guia_desenvolvimento.md) | Guia de desenvolvimento |
| 14 | [14_arquitetura_e_manutencao.md](14_arquitetura_e_manutencao.md) | Onde editar cada comportamento |
| 15 | [15_testes_e_gate.md](15_testes_e_gate.md) | Build gate e testes manuais |
| 16 | [16_fundamentacao_redes.md](16_fundamentacao_redes.md) | Teoria ↔ código |
| — | [appendix_portas_e_multicast.md](appendix_portas_e_multicast.md) | Portas, multicast, WSL |
| — | [engineering_backlog.md](engineering_backlog.md) | Débitos técnicos |
+5 -1
View File
@@ -1,6 +1,10 @@
# Referências — Pitiupi # Referências — Pitiupi
Bibliografia e notas curtas para apoiar a disciplina de Redes de Computadores. Bibliografia e notas curtas para apoiar a disciplina de Redes de Computadores. **Fonte única** para citações longas — capítulos em `documentation/` linkam aqui em vez de repetir bibliografia.
**Sugestões de livro-texto:** Kurose & Ross — *Redes de Computadores e a Internet*; Tanenbaum — *Redes de Computadores*; Peterson & Davie — *Redes de Computadores*.
**RFCs úteis:** UDP (768), TCP (793), IP multicast (1112, 3376). Documentação Java: [Serialization](https://docs.oracle.com/en/java/javase/17/docs/specs/serialization/index.html), [SPI](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/ServiceLoader.html), sockets e Swing EDT.
| Recurso | Descrição | | Recurso | Descrição |
| --- | --- | | --- | --- |
-7
View File
@@ -1,7 +0,0 @@
# Documentação do Pitiupi
Toda a documentação canônica está na raiz do repositório:
**[../../docs/README.md](../../docs/README.md)**
Comece por [../../docs/documentation/00_quickstart.md](../../docs/documentation/00_quickstart.md).