From 5e835f4d7520b8bfdaaed567c872956ef7c39cb2 Mon Sep 17 00:00:00 2001 From: tonyhcj Date: Wed, 22 Jul 2026 15:58:13 -0300 Subject: [PATCH 1/5] Adiciona .gitignore --- .gitignore | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..53d2375 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +/pitiupi/build/ +/pitiupi/dist/ +/pitiupi.chat/build/ +/pitiupi.chat/dist/ +/pitiupi.chat/nbproject/private/ +/pitiupi.screenCast/build/ +/pitiupi.screenCast/dist/ From 668b2d417bfe1c8c1480c402870a0349d9ef0d14 Mon Sep 17 00:00:00 2001 From: tonyhcj Date: Wed, 22 Jul 2026 18:53:11 -0300 Subject: [PATCH 2/5] Corrige Preferences: name/port do Login agora atualizam MainWindow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Login.commitEdit() no JSpinner para capturar porta digitada manualmente - Main.java agora exibe o Login antes de criar o MainWindow - MenuBar aplica os valores do Login no MainWindow via setUserName/setPort - MainWindow: campos userName/port deixam de ser final; setPort() reconecta o socket - Socket.java ganha close() para permitir reconexão limpa em nova porta --- pitiupi/src/pitiupi/GUI/Login.java | 8 +++++++ pitiupi/src/pitiupi/GUI/MainWindow.java | 28 +++++++++++++++++++++++-- pitiupi/src/pitiupi/GUI/MenuBar.java | 9 +++++++- pitiupi/src/pitiupi/Main.java | 10 +++++---- pitiupi/src/pitiupi/net/Socket.java | 28 +++++++++++++++++++++---- 5 files changed, 72 insertions(+), 11 deletions(-) diff --git a/pitiupi/src/pitiupi/GUI/Login.java b/pitiupi/src/pitiupi/GUI/Login.java index 4c9c61c..3b3765e 100644 --- a/pitiupi/src/pitiupi/GUI/Login.java +++ b/pitiupi/src/pitiupi/GUI/Login.java @@ -22,6 +22,7 @@ import javax.swing.JTextField; /** * * @author flavio + * @author tony */ public final class Login extends JDialog { @@ -82,10 +83,17 @@ public final class Login extends JDialog { this.add(topPanel); this.add(buttonPanel, BorderLayout.SOUTH); + okButton.addActionListener((ActionEvent e) -> { + try { + portField.commitEdit(); + } catch (java.text.ParseException ex) { + return; + } Login.this.setVisible(false); }); + cancelButton.addActionListener((ActionEvent e) -> { System.exit(0); }); diff --git a/pitiupi/src/pitiupi/GUI/MainWindow.java b/pitiupi/src/pitiupi/GUI/MainWindow.java index 009f66d..73cb955 100644 --- a/pitiupi/src/pitiupi/GUI/MainWindow.java +++ b/pitiupi/src/pitiupi/GUI/MainWindow.java @@ -32,8 +32,8 @@ public class MainWindow extends javax.swing.JFrame { private Socket socket; - private final String userName; - private final int port; + private String userName; + private int port; private PluginLoader pluginManager; private final List plugins; @@ -111,4 +111,28 @@ public class MainWindow extends javax.swing.JFrame { public List getPlugins() { return plugins; } + + public void setUserName(String userName) { + this.userName = userName; + updateStatus(); + } + + public void setPort(int port) { + this.port = port; + reconnect(); + updateStatus(); + } + + private void updateStatus() { + this.status.setText("Connected on port " + this.port + " name " + this.userName); + } + + private void reconnect() { + if (this.socket != null) { + this.socket.close(); + } + this.socket = new Socket(this); + this.socket.start(); + } + } diff --git a/pitiupi/src/pitiupi/GUI/MenuBar.java b/pitiupi/src/pitiupi/GUI/MenuBar.java index 2a7e1b1..64fc6c7 100644 --- a/pitiupi/src/pitiupi/GUI/MenuBar.java +++ b/pitiupi/src/pitiupi/GUI/MenuBar.java @@ -11,6 +11,8 @@ import javax.swing.JMenuBar; /** * * @author flavio + * @author tony + * */ public class MenuBar extends JMenuBar { @@ -56,9 +58,14 @@ public class MenuBar extends JMenuBar { mainWindow.exit(); } - private void setupMenuActionPerformed(java.awt.event.ActionEvent evt) { + + private void setupMenuActionPerformed(java.awt.event.ActionEvent evt) { Login login = new Login(); login.setVisible(true); + + mainWindow.setUserName(login.getName()); + mainWindow.setPort(login.getPort()); + login.dispose(); } diff --git a/pitiupi/src/pitiupi/Main.java b/pitiupi/src/pitiupi/Main.java index 297b61a..deb38d1 100644 --- a/pitiupi/src/pitiupi/Main.java +++ b/pitiupi/src/pitiupi/Main.java @@ -12,6 +12,7 @@ import java.util.logging.Logger; /** * * @author flavio + * @author tony */ public class Main { @@ -40,16 +41,17 @@ public class Main { } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(pitiupi.GUI.MainWindow.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } - // - /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { + pitiupi.GUI.Login login = new pitiupi.GUI.Login(); + login.setVisible(true); + pitiupi.GUI.MainWindow main; - main = new pitiupi.GUI.MainWindow(System.getProperty("user.name"), 8000); + main = new pitiupi.GUI.MainWindow(login.getName(), login.getPort()); main.setVisible(true); - } + } }); } diff --git a/pitiupi/src/pitiupi/net/Socket.java b/pitiupi/src/pitiupi/net/Socket.java index 0a99fde..ad26059 100644 --- a/pitiupi/src/pitiupi/net/Socket.java +++ b/pitiupi/src/pitiupi/net/Socket.java @@ -29,6 +29,7 @@ public class Socket extends Thread { private MulticastSocket multicastSocket; private InetAddress address; private MainWindow main; + private volatile boolean running = true; public final static String INET_ADDR = "224.0.0.3"; public Socket(MainWindow main) { @@ -56,24 +57,43 @@ public class Socket extends Thread { multicastSocket.send(msgPacket); } + public void close() { + running = false; + if (multicastSocket != null) { + try { + multicastSocket.leaveGroup(address); + } catch (IOException ex) { + + } + multicastSocket.close(); + } + } + public void receive() throws UnknownHostException, IOException, ClassNotFoundException { byte[] buf = new byte[256000]; - while (true) { + while (running) { DatagramPacket msgPacket = new DatagramPacket(buf, buf.length); - multicastSocket.receive(msgPacket); - + try { + multicastSocket.receive(msgPacket); + } catch (IOException ex) { + if (!running) { + break; + } + throw ex; + } HeartbeatMessage heartbeat = tryParseHeartbeat(msgPacket.getData()); if (heartbeat != null) { main.getHeartbeatManager().receiveHeartbeat(heartbeat, msgPacket.getAddress()); continue; } - for (Plugin plugin : main.getPlugins()) { System.out.println(msgPacket.getAddress().toString()); plugin.receiveMessage(msgPacket.getData()); } } } + + private HeartbeatMessage tryParseHeartbeat(byte[] data) { try { From a7ba307daf64fed49d322df40f56956918ae3850 Mon Sep 17 00:00:00 2001 From: tonyhcj Date: Fri, 24 Jul 2026 19:31:39 -0300 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20usar=20instanceId=20=C3=BAnico=20em?= =?UTF-8?q?=20vez=20de=20userName=20para=20identificar=20heartbeats?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pitiupi/src/pitiupi/control/HeartbeatManager.java | 10 ++++++---- pitiupi/src/pitiupi/net/HeartbeatMessage.java | 8 +++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/pitiupi/src/pitiupi/control/HeartbeatManager.java b/pitiupi/src/pitiupi/control/HeartbeatManager.java index b3a83a9..77466c6 100644 --- a/pitiupi/src/pitiupi/control/HeartbeatManager.java +++ b/pitiupi/src/pitiupi/control/HeartbeatManager.java @@ -14,6 +14,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import pitiupi.GUI.MainWindow; import pitiupi.net.HeartbeatMessage; +import java.util.UUID; /** * * @author tony @@ -27,6 +28,7 @@ public class HeartbeatManager { private final Map peers = new ConcurrentHashMap<>(); private final List listeners = new CopyOnWriteArrayList<>(); private ScheduledExecutorService scheduler; + private final String instanceId = UUID.randomUUID().toString(); public HeartbeatManager(MainWindow mainWindow) { this.mainWindow = mainWindow; @@ -46,21 +48,21 @@ public class HeartbeatManager { private void announce() { try { - HeartbeatMessage msg = new HeartbeatMessage(mainWindow.getUserName()); + HeartbeatMessage msg = new HeartbeatMessage(mainWindow.getUserName(), instanceId); mainWindow.getSocket().send(msg.toByteArray()); } catch (IOException ex) { Logger.getLogger(HeartbeatManager.class.getName()).log(Level.WARNING, "Falha ao enviar heartbeat", ex); } } - // Chamado pelo Socket quando um pacote é identificado como heartbeat + public void receiveHeartbeat(HeartbeatMessage msg, InetAddress from) { // ignora o próprio heartbeat - if (msg.getUserName().equals(mainWindow.getUserName())) { + if (msg.getInstanceId().equals(instanceId) ) { return; } - String key = from.getHostAddress() + "#" + msg.getUserName(); + String key = msg.getInstanceId(); boolean isNew = !peers.containsKey(key); PeerInfo peer = peers.computeIfAbsent(key, k -> new PeerInfo(msg.getUserName(), from, msg.getTimestamp())); diff --git a/pitiupi/src/pitiupi/net/HeartbeatMessage.java b/pitiupi/src/pitiupi/net/HeartbeatMessage.java index f8cf549..b42f306 100644 --- a/pitiupi/src/pitiupi/net/HeartbeatMessage.java +++ b/pitiupi/src/pitiupi/net/HeartbeatMessage.java @@ -7,9 +7,11 @@ public class HeartbeatMessage extends Message { private final String userName; private final long timestamp; + private final String instanceId; - public HeartbeatMessage(String userName) { + public HeartbeatMessage(String userName, String instanceId) { this.userName = userName; + this.instanceId = instanceId; this.timestamp = System.currentTimeMillis(); } @@ -20,4 +22,8 @@ public class HeartbeatMessage extends Message { public long getTimestamp() { return timestamp; } + + public String getInstanceId() { + return instanceId; + } } From 239a10e79feb844a2c9d0b49da3a10a2e8d5abe1 Mon Sep 17 00:00:00 2001 From: tonyhcj Date: Tue, 28 Jul 2026 22:11:37 -0300 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20Corrige=20bug=20que=20exibia=20frame?= =?UTF-8?q?0=20como=20nome=20do=20usu=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java b/pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java index f894a65..3b707fa 100644 --- a/pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java +++ b/pitiupi.chat/src/pitiupi/chat/GUI/ChatWindow.java @@ -94,7 +94,7 @@ public class ChatWindow extends javax.swing.JDialog { if (jTextArea1.getText().trim().length() == 0) { return; } - ChatMessage message = new ChatMessage(mainWindow.getName(), jTextArea1.getText()); + ChatMessage message = new ChatMessage(mainWindow.getUserName(), jTextArea1.getText()); this.sendChatMessage(message); jTextArea1.setText(""); } From 7f21e89a0afec0edc396ea67d60a20674af4fd77 Mon Sep 17 00:00:00 2001 From: tonyhcj Date: Wed, 29 Jul 2026 15:00:44 -0300 Subject: [PATCH 5/5] fix: salvando nome e porta --- pitiupi/src/pitiupi/GUI/Login.java | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/pitiupi/src/pitiupi/GUI/Login.java b/pitiupi/src/pitiupi/GUI/Login.java index 3b3765e..2fde02c 100644 --- a/pitiupi/src/pitiupi/GUI/Login.java +++ b/pitiupi/src/pitiupi/GUI/Login.java @@ -1,8 +1,3 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ package pitiupi.GUI; import java.awt.BorderLayout; @@ -11,6 +6,7 @@ import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; +import java.util.prefs.Preferences; import javax.swing.JButton; import javax.swing.JDialog; @@ -26,6 +22,10 @@ import javax.swing.JTextField; */ public final class Login extends JDialog { + private static final Preferences prefs = Preferences.userNodeForPackage(Login.class); + private static final String PREF_NOME = "lastUserName"; + private static final String PREF_PORTA = "lastPort"; + JLabel nameLabel = new JLabel("Name: "); JLabel portLabel = new JLabel("Port: "); @@ -44,8 +44,12 @@ public final class Login extends JDialog { public void initComponents() { this.setTitle("Login"); - portField.setModel(new javax.swing.SpinnerNumberModel(8000, 8000, 9000, 1)); - nameField.setText(System.getProperty("user.name")); + + String nomeSalvo = prefs.get(PREF_NOME, System.getProperty("user.name")); + int portaSalva = prefs.getInt(PREF_PORTA, 8000); + + portField.setModel(new javax.swing.SpinnerNumberModel(portaSalva, 8000, 9000, 1)); + nameField.setText(nomeSalvo); JPanel topPanel = new JPanel(new GridBagLayout()); JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); @@ -83,17 +87,19 @@ public final class Login extends JDialog { this.add(topPanel); this.add(buttonPanel, BorderLayout.SOUTH); - okButton.addActionListener((ActionEvent e) -> { try { portField.commitEdit(); } catch (java.text.ParseException ex) { return; } + + prefs.put(PREF_NOME, nameField.getText()); + prefs.putInt(PREF_PORTA, (Integer) portField.getValue()); + Login.this.setVisible(false); }); - cancelButton.addActionListener((ActionEvent e) -> { System.exit(0); });