Consolida núcleo (presença, peer actions, MessageDispatcher), chat e screencast na galeria, documentação PT-BR e testes JUnit; remove mpChat do catálogo em favor do chat unificado. Co-authored-by: Cursor <cursoragent@cursor.com>
4.3 KiB
Tutorial de aula — plugin Ping
Material para o aluno implementar um plugin Ping/Pong com medição de RTT (round-trip time). A solução em Java não entra no repositório oficial; apenas este tutorial e a pasta plugins/ping/ (README + .gitignore).
Índice geral: README.md.
Objetivos
- Estender
Plugine registrar SPI. - Mensagens
Serializableque estendemMessage. ConnectionManager: multicast UDP, unicast UDP e TCP.- UI na aba central:
JPanel+bindShellWorkspaceContent(semJFrame); abrir pela galeria Plugins ou peer actions. - Instalar JAR em
PITIUPI_HOME/pluginse testar com um colega.
Pré-requisitos
- Pitiupi com login (nome + porta).
- 09_sistema_de_plugins.md.
- JDK, Ant; núcleo em
pitiupi/dist/pitiupi.jar.
Estrutura sugerida (projeto do aluno)
plugins/ping/ # ou projeto fora do repo oficial
├── build.xml
├── nbproject/
├── src/
│ ├── META-INF/services/pitiupi.models.Plugin
│ └── br/ufsj/redes/ping/
│ ├── PingPlugin.java
│ ├── PingMessage.java
│ ├── PongMessage.java
│ └── PingPanel.java
└── dist/pitiupi.ping.jar
Modelo Ant: copiar plugins/chat e ajustar classpath para ../../pitiupi/dist/pitiupi.jar.
Passo 1 — Projeto Ant
- Copiar
plugins/chat. - JAR de saída:
dist/pitiupi.ping.jar. - Classpath de compilação: JAR do núcleo.
Verificação: ant jar sem erros.
Passo 2 — PingPlugin
| Método | Exemplo |
|---|---|
getName() |
"Ping" |
getDisplayName() |
"Ping na rede" |
getIdentifier() |
"pitiupi.ping" (único na sala) |
Em createPlugin(ConnectionManager cm, PluginWorkspace workspace):
pingPanel = new PingPanel(cm);
bindShellWorkspaceContent(pingPanel);
installPeerActions(workspace.peerActions());
Não chame openOrFocusTab no boot — a aba abre quando o usuário clicar na galeria ou usar peer action.
Peer actions sugeridas: “Enviar ping” (peer único), “Ping para todos”.
Verificação: após instalar o JAR e reiniciar, só Plugins e Configurações no boot; botão na galeria abre a aba Ping.
Passo 3 — Mensagens
PingMessage e PongMessage com pingId (UUID) e timestamps para RTT.
Registrar em getMessages():
return List.of(PingMessage.class, PongMessage.class);
Em receiveMessage: ao receber ping, responder pong; ao receber pong, calcular RTT e atualizar a UI com SwingUtilities.invokeLater.
Passo 4 — PingPanel
Botões para multicast, unicast UDP e TCP; área de log ou label com último RTT em ms. Para um peer, use campo IP como no ChatPanel ou peer action na lista lateral.
Passo 5 — Transportes
Use pitiupi.application.messaging.MessageDispatcher no núcleo:
MessageDispatcher.send(connectionManager, pingMessage, SendTarget.broadcastAll(), TransportMode.MULTICAST_UDP);
MessageDispatcher.send(connectionManager, pingMessage, SendTarget.singlePeer(addr), TransportMode.UNICAST_UDP);
MessageDispatcher.send(connectionManager, pingMessage, SendTarget.singlePeer(addr), TransportMode.TCP);
| Destino | Transporte didático | Observação |
|---|---|---|
| Todos | Multicast UDP | Padrão em sala |
| Todos | Unicast UDP | Loop em cada peer online (demo) |
| Um peer | Unicast UDP / TCP | IP da lista ou manual |
Não alterar o endereço multicast do núcleo (224.0.0.3).
Passo 6 — SPI e instalação
META-INF/services/pitiupi.models.Plugin:
br.ufsj.redes.ping.PingPlugin
Copiar JAR para ~/pitiupi/plugins/ (ou instalar pela aba Configurações) e reiniciar.
Critérios de sucesso
| # | Critério |
|---|---|
| C1 | JAR carrega sem exceção |
| C2 | Pelo menos um transporte funciona entre duas instâncias |
| C3 | RTT em ms após o pong |
| C4 | README do aluno com build e transporte usado |
Anti-padrões
- Commitar solução no repo oficial.
- Busy-wait na EDT.
- Objetos não
Serializable. - Mesmo
getIdentifier()que outro plugin.