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:
1 parent
7460465f81
commit
de65f3063f
18 files changed
+383
-126
No files matched your search
@@ -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
@@ -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.
|
|
||||||
@@ -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).
|
||||||
@@ -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).
|
||||||
@@ -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.
|
||||||
@@ -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).
|
||||||
@@ -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]
|
||||||
|
```
|
||||||
@@ -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
|
||||||
@@ -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)
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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 |
|
|
||||||
@@ -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 |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
|
|||||||
@@ -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).
|
|
||||||
Reference in new issue
Block a user