diff --git a/Projet.jar b/Projet.jar index 2f685c5..5cbe56c 100644 Binary files a/Projet.jar and b/Projet.jar differ diff --git a/src/chat/ClientWindow.java b/src/chat/ClientWindow.java index 78216e9..8497f2e 100644 --- a/src/chat/ClientWindow.java +++ b/src/chat/ClientWindow.java @@ -137,7 +137,7 @@ public class ClientWindow implements ActionListener { if("".compareTo(message) != 0) { messageField.setText(""); - network.send(new Message(network.getUser(), message)); + network.send(new Message(network.getUser(), message, false)); } } } diff --git a/src/chat/ConnectNotification.java b/src/chat/ConnectNotification.java index 957daea..699c3ad 100644 --- a/src/chat/ConnectNotification.java +++ b/src/chat/ConnectNotification.java @@ -1,9 +1,16 @@ package chat; public class ConnectNotification extends Notification { - ConnectNotification (User in_author) + private Boolean outdoor; + ConnectNotification (User in_author, Boolean in_redirected, Boolean in_outdoor) { - super(in_author); + author = in_author; + redirected = in_redirected; + outdoor = in_outdoor; } + public Boolean isOutdoor() + { + return outdoor; + } } diff --git a/src/chat/DisconnectNotification.java b/src/chat/DisconnectNotification.java index d1bb8f6..17cdef8 100644 --- a/src/chat/DisconnectNotification.java +++ b/src/chat/DisconnectNotification.java @@ -1,8 +1,9 @@ package chat; public class DisconnectNotification extends Notification { - DisconnectNotification (User in_author) + DisconnectNotification (User in_author, Boolean in_redirected) { - super(in_author); + author = in_author; + redirected = in_redirected; } } \ No newline at end of file diff --git a/src/chat/Message.java b/src/chat/Message.java index b2cb704..6d4331b 100644 --- a/src/chat/Message.java +++ b/src/chat/Message.java @@ -6,10 +6,11 @@ import java.util.*; public class Message extends Notification { private String text; - Message (User in_author, String in_text) + Message (User in_author, String in_text, Boolean in_redirected) { - super(in_author); + author = in_author; text = in_text; + redirected = in_redirected; } public void setText(String new_text) { diff --git a/src/chat/NetworkClient.java b/src/chat/NetworkClient.java index 121ab90..e21a6ba 100644 --- a/src/chat/NetworkClient.java +++ b/src/chat/NetworkClient.java @@ -38,7 +38,7 @@ public class NetworkClient { NetworkClient(JTextArea in_chatText, JTextArea in_knownUsersPanel) { - user = null; + user = new User(""); chatText = in_chatText; knownUsersPanel = in_knownUsersPanel; known_users = new ArrayList(); @@ -123,11 +123,11 @@ public class NetworkClient { System.out.println(usernameList.length + " users currently connected"); for(String u:usernameList) { - known_users.add(new User (u, false)); + known_users.add(new User (u)); } for(String u:outdoorUsernameList) { - known_outdoor_users.add(new User (u, true)); + known_outdoor_users.add(new User (u)); } for(String a:addressList) { @@ -193,9 +193,9 @@ public class NetworkClient { } } - user = new User(username, outdoor); + user.setName(username); - send(new ConnectNotification(user)); + send(new ConnectNotification(user, false, outdoor)); } return connected; @@ -229,7 +229,7 @@ public class NetworkClient { void disconnect() { - send(new DisconnectNotification(user)); + send(new DisconnectNotification(user, false)); try { Thread.sleep(1000); @@ -244,16 +244,6 @@ public class NetworkClient { } catch(IOException e){} } - for(Socket s:outdoor_dest_sockets) - { - try - { - s.close(); - } - catch(IOException e){} - } - dest_sockets.clear(); - outdoor_dest_sockets.clear(); } User getUser() diff --git a/src/chat/Notification.java b/src/chat/Notification.java index a631b26..ab148f6 100644 --- a/src/chat/Notification.java +++ b/src/chat/Notification.java @@ -4,12 +4,8 @@ import java.io.Serializable; abstract class Notification implements Serializable{ - private User author; - - Notification(User in_author) - { - author = in_author; - } + protected User author; + protected Boolean redirected; public void setAuthor(User new_author) { @@ -19,4 +15,12 @@ abstract class Notification implements Serializable{ { return author; } + public Boolean isRedirected() + { + return redirected; + } + public void setRedirected(Boolean in_redirected) + { + redirected = in_redirected; + } } diff --git a/src/chat/ReceiveThread.java b/src/chat/ReceiveThread.java index 57aff9c..b7b6a4a 100644 --- a/src/chat/ReceiveThread.java +++ b/src/chat/ReceiveThread.java @@ -37,116 +37,118 @@ class ReceiveThread extends Thread { } public void run() { - ObjectInputStream in; boolean exit = false; - while(!exit) - { - try + try + { + while(!exit) { - in = new ObjectInputStream(socket.getInputStream()); - Notification notif = (Notification) in.readObject(); - - if(!(notif.getAuthor().equals(user)) && !(notif.getAuthor().isOutdoor() && !isOutdoor)) - { - for(Socket s:outdoor_dest_sockets) - { - try + ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); + Notification notif = (Notification) in.readObject(); + + if(!(notif.getAuthor().equals(user)) && !notif.isRedirected()) + { + for(Socket s:outdoor_dest_sockets) + { + try + { + ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); + notif.setRedirected(true); + out.writeObject(notif); + notif.setRedirected(false); + } + catch(IOException e){} + } + } + + if(isOutdoor) + { + for(Socket s:dest_sockets) { - ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); - - out.writeObject(notif); - + try + { + ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); + notif.setRedirected(true); + out.writeObject(notif); + } + catch(IOException e){} } - catch(IOException e){} - } - } - - if(isOutdoor) - { - for(Socket s:dest_sockets) - { - try - { - ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); - - out.writeObject(notif); - } - catch(IOException e){} - } - - } + } + else + { + if(notif instanceof Message) + { + Message m = (Message) notif; + displayArea.append(m.getAuthor().getName() + " : " + m.getText() + "\n"); + } + else if (notif instanceof DisconnectNotification) + { + DisconnectNotification dn = (DisconnectNotification) notif; + + displayArea.append(dn.getAuthor().getName() + " has left the chat.\n"); + + known_users.remove(dn.getAuthor()); + known_outdoor_users.remove(dn.getAuthor()); + + if(!dn.isRedirected() && !dn.getAuthor().equals(user)) + { + exit = true; + + socket.close(); + if(!isOutdoor) + dest_sockets.remove(socket); + else + outdoor_dest_sockets.remove(socket); + } + } + + else if (notif instanceof ConnectNotification) + { + ConnectNotification cn = (ConnectNotification) notif; + + displayArea.append(cn.getAuthor().getName() + " has joined the chat.\n"); + if(cn.isOutdoor()) + { + if(!known_outdoor_users.contains(cn.getAuthor())) + { + known_outdoor_users.add(cn.getAuthor()); + Collections.sort(known_outdoor_users); + } + } + else + { + if(!known_users.contains(cn.getAuthor())) + { + known_users.add(cn.getAuthor()); + Collections.sort(known_users); + } + } + } + knownUsersPanel.setText(""); + knownUsersPanel.append("Indoor users:\n"); + for(User a:known_users) + { + knownUsersPanel.append(" " + a.getName() + " \n"); + } + knownUsersPanel.append("\nOutdoor users:\n"); + for(User a:known_outdoor_users) + { + knownUsersPanel.append(" " + a.getName() + " \n"); + } + displayArea.setCaretPosition(displayArea.getDocument().getLength()); + } + } + } + catch(EOFException e) {} + catch(SocketException e) + { + if(!isOutdoor) + dest_sockets.remove(socket); else - { - if(notif instanceof Message) - { - Message m = (Message) notif; - displayArea.append(m.getAuthor().getName() + " : " + m.getText() + "\n"); - } - else if (notif instanceof DisconnectNotification) - { - DisconnectNotification dn = (DisconnectNotification) notif; - - displayArea.append(dn.getAuthor().getName() + " has left the chat.\n"); - - known_users.remove(dn.getAuthor()); - known_outdoor_users.remove(dn.getAuthor()); - - if(!dn.getAuthor().equals(user) && !(dn.getAuthor().isOutdoor() && !isOutdoor)) - { - exit = true; - - socket.close(); - if(!isOutdoor) - dest_sockets.remove(socket); - else - outdoor_dest_sockets.remove(socket); - } - } - - else if (notif instanceof ConnectNotification) - { - ConnectNotification cn = (ConnectNotification) notif; - - displayArea.append(cn.getAuthor().getName() + " has joined the chat.\n"); - if(cn.getAuthor().isOutdoor()) - { - if(!known_outdoor_users.contains(cn.getAuthor())) - { - known_outdoor_users.add(cn.getAuthor()); - Collections.sort(known_outdoor_users); - } - } - else - { - if(!known_users.contains(cn.getAuthor())) - { - known_users.add(cn.getAuthor()); - Collections.sort(known_users); - } - } - } - knownUsersPanel.setText(""); - knownUsersPanel.append("Indoor users:\n"); - for(User a:known_users) - { - knownUsersPanel.append(" " + a.getName() + " \n"); - } - knownUsersPanel.append("\nOutdoor users:\n"); - for(User a:known_outdoor_users) - { - knownUsersPanel.append(" " + a.getName() + " \n"); - } - displayArea.setCaretPosition(displayArea.getDocument().getLength()); - } - } - catch(Exception e) - { - in.reset(); - e.printStackTrace(); - /*System.out.println("Socket closed"); - dest_sockets.remove(socket); - outdoor_dest_sockets.remove(socket);*/ - } + outdoor_dest_sockets.remove(socket); } + catch(Exception e) + { + e.printStackTrace(); + } } } diff --git a/src/chat/User.java b/src/chat/User.java index 00d115e..698a554 100644 --- a/src/chat/User.java +++ b/src/chat/User.java @@ -6,14 +6,12 @@ import java.util.*; public class User implements Comparable, Serializable{ private String name; - private Boolean outdoor; // private String address; - public User(String in_name, Boolean in_outdoor) + public User(String in_name) { name = in_name; - outdoor = in_outdoor; // address = in_address; } @@ -25,10 +23,6 @@ public class User implements Comparable, Serializable{ { return name; } - public Boolean isOutdoor() - { - return outdoor; - } /*public void setAddress(String new_address) { name = new_address; @@ -51,5 +45,4 @@ public class User implements Comparable, Serializable{ { return name.compareTo(otherUser.getName()); } - } \ No newline at end of file