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/ 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(""); } diff --git a/pitiupi.screenCast/.idea/workspace.xml b/pitiupi.screenCast/.idea/workspace.xml new file mode 100644 index 0000000..96dbbb3 --- /dev/null +++ b/pitiupi.screenCast/.idea/workspace.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1784745206049 + + + + \ No newline at end of file diff --git a/pitiupi/src/pitiupi/GUI/Login.java b/pitiupi/src/pitiupi/GUI/Login.java index 3bac894..20b2a37 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,9 +22,14 @@ import javax.swing.JTextField; * multicast que será utilizada pela comunicação.

* * @author flavio + * @author tony */ 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: "); @@ -47,8 +48,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)); @@ -87,6 +92,15 @@ public final class Login extends JDialog { 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); }); diff --git a/pitiupi/src/pitiupi/GUI/MainWindow.java b/pitiupi/src/pitiupi/GUI/MainWindow.java index 23b0bfc..f1276aa 100644 --- a/pitiupi/src/pitiupi/GUI/MainWindow.java +++ b/pitiupi/src/pitiupi/GUI/MainWindow.java @@ -41,8 +41,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; @@ -137,4 +137,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 88b89ee..1e3a4a8 100644 --- a/pitiupi/src/pitiupi/GUI/MenuBar.java +++ b/pitiupi/src/pitiupi/GUI/MenuBar.java @@ -16,6 +16,8 @@ import javax.swing.JMenuBar; * * @author flavio * @author Gustavo + * @author tony + * */ public class MenuBar extends JMenuBar { @@ -67,9 +69,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 584c75f..9e07887 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 { /** @@ -39,16 +40,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/control/HeartbeatManager.java b/pitiupi/src/pitiupi/control/HeartbeatManager.java index 5225000..4de8a4b 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; /** * Gerencia o mecanismo de heartbeat da aplicação. * @@ -32,6 +33,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; @@ -51,7 +53,7 @@ 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); @@ -70,13 +72,14 @@ public class HeartbeatManager { * @param msg mensagem de heartbeat recebida. * @param from endereço de rede do usuário que enviou a mensagem. */ + 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 04e0cf3..5a07ec8 100644 --- a/pitiupi/src/pitiupi/net/HeartbeatMessage.java +++ b/pitiupi/src/pitiupi/net/HeartbeatMessage.java @@ -11,9 +11,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(); } @@ -24,4 +26,8 @@ public class HeartbeatMessage extends Message { public long getTimestamp() { return timestamp; } + + public String getInstanceId() { + return instanceId; + } } diff --git a/pitiupi/src/pitiupi/net/Socket.java b/pitiupi/src/pitiupi/net/Socket.java index e60e0ed..139484a 100644 --- a/pitiupi/src/pitiupi/net/Socket.java +++ b/pitiupi/src/pitiupi/net/Socket.java @@ -33,6 +33,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"; /** @@ -71,6 +72,19 @@ 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(); + } + } + + /** * Inicia o loop de recepção de mensagens da aplicação. * @@ -84,16 +98,21 @@ public class Socket extends Thread { */ 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());