From 972671ee8ffb1ae2e4c26bace83cc7a55f8af5bc Mon Sep 17 00:00:00 2001 From: Metatheria Date: Mon, 15 Feb 2021 12:34:31 +0100 Subject: [PATCH] outdoor users(12) --- src/chat/ClientWindow.java | 4 +- src/chat/ConnectNotification.java | 16 + src/chat/ConnectionListenerThread.java | 136 ++++++++ src/chat/DisconnectNotification.java | 9 + src/chat/ListenerStartThread.java | 25 ++ src/chat/Message.java | 24 +- src/chat/NetworkClient.java | 418 +------------------------ src/chat/Notification.java | 26 ++ src/chat/OutdoorListenerThread.java | 115 +++++++ src/chat/ReceiveThread.java | 152 +++++++++ 10 files changed, 499 insertions(+), 426 deletions(-) create mode 100644 src/chat/ConnectNotification.java create mode 100644 src/chat/ConnectionListenerThread.java create mode 100644 src/chat/DisconnectNotification.java create mode 100644 src/chat/ListenerStartThread.java create mode 100644 src/chat/Notification.java create mode 100644 src/chat/OutdoorListenerThread.java create mode 100644 src/chat/ReceiveThread.java diff --git a/src/chat/ClientWindow.java b/src/chat/ClientWindow.java index b7d7686..8497f2e 100644 --- a/src/chat/ClientWindow.java +++ b/src/chat/ClientWindow.java @@ -134,10 +134,10 @@ public class ClientWindow implements ActionListener { public void actionPerformed(ActionEvent event) { String message = messageField.getText(); - if(message.compareTo("") != 0) + if("".compareTo(message) != 0) { messageField.setText(""); - network.send(message); + network.send(new Message(network.getUser(), message, false)); } } } diff --git a/src/chat/ConnectNotification.java b/src/chat/ConnectNotification.java new file mode 100644 index 0000000..699c3ad --- /dev/null +++ b/src/chat/ConnectNotification.java @@ -0,0 +1,16 @@ +package chat; + +public class ConnectNotification extends Notification { + private Boolean outdoor; + ConnectNotification (User in_author, Boolean in_redirected, Boolean in_outdoor) + { + author = in_author; + redirected = in_redirected; + outdoor = in_outdoor; + } + + public Boolean isOutdoor() + { + return outdoor; + } +} diff --git a/src/chat/ConnectionListenerThread.java b/src/chat/ConnectionListenerThread.java new file mode 100644 index 0000000..ee246bd --- /dev/null +++ b/src/chat/ConnectionListenerThread.java @@ -0,0 +1,136 @@ +package chat; + +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.util.Collections; +import java.util.List; + +import javax.swing.JTextArea; + +public class ConnectionListenerThread extends Thread { + User user; + JTextArea displayArea; + JTextArea knownUsersPanel; + List known_users; + List known_outdoor_users; + List dest_sockets; + List outdoor_dest_sockets; + int portNumber; + + ConnectionListenerThread(User in_user, List in_known_users, List in_known_outdoor_users, List in_dest_sockets, List in_outdoor_dest_sockets, + JTextArea in_displayArea, JTextArea in_knownUsersPanel, int in_portNumber) + { + user = in_user; + known_users = in_known_users; + known_outdoor_users = in_known_outdoor_users; + dest_sockets = in_dest_sockets; + outdoor_dest_sockets = in_outdoor_dest_sockets; + displayArea = in_displayArea; + knownUsersPanel = in_knownUsersPanel; + portNumber = in_portNumber; + } + public void run() + { + boolean exit = false; + boolean accepted = true; + boolean outdoor; + byte[] buffer = new byte[100]; + DatagramPacket request = new DatagramPacket(buffer, buffer.length); + DatagramPacket responsePacket; + + DatagramSocket requestSocket; + DatagramSocket responseSocket; + + String username; + String response = ""; + + byte[] responseBytes; + try + { + requestSocket = new DatagramSocket(1234); + responseSocket = new DatagramSocket(); + + while(!exit) + { + try + { + System.out.println("Waiting for connection request"); + requestSocket.receive(request); + username = new String(request.getData(), 0, request.getLength()); + + if(username.charAt(0) == '+') + { + username = username.substring(1); + outdoor = true; + } + else + { + outdoor = false; + InetAddress clientAddress= request.getAddress(); + System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress()); + + response = ""; + for(User u:known_users) + { + response += u.getName() + " "; + } + response = response.trim(); + response += ";"; + for(User u:known_outdoor_users) + { + response += u.getName() + " "; + } + response = response.trim(); + response += ";"; + for(Socket s:dest_sockets) + { + response += s.getInetAddress().getHostAddress() + " "; + } + response = response.trim(); + + response += ";" + (portNumber+1); + + System.out.println("Response :" + response); + responseBytes = response.getBytes(); + responsePacket = new DatagramPacket(responseBytes, responseBytes.length, clientAddress, 1337); + responseSocket.send(responsePacket); + } + accepted = true; + for(User a:known_users) + { + accepted = accepted && (!username.equals(a.getName())); + } + for(User a:known_outdoor_users) + { + accepted = accepted && (!username.equals(a.getName())); + } + if(accepted) + { + if(outdoor) + { + known_outdoor_users.add(new User(username)); + Collections.sort(known_outdoor_users); + } + else + { + portNumber++; + Socket s = (new ServerSocket(portNumber)).accept(); + (new ReceiveThread(user, s, displayArea, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start(); + dest_sockets.add(s); + } + } + } + catch(SocketTimeoutException e) {} + } + } + catch(Exception e) + { + e.printStackTrace(); + System.out.println(e.getMessage()); + } + } +} diff --git a/src/chat/DisconnectNotification.java b/src/chat/DisconnectNotification.java new file mode 100644 index 0000000..17cdef8 --- /dev/null +++ b/src/chat/DisconnectNotification.java @@ -0,0 +1,9 @@ +package chat; + +public class DisconnectNotification extends Notification { + DisconnectNotification (User in_author, Boolean in_redirected) + { + author = in_author; + redirected = in_redirected; + } +} \ No newline at end of file diff --git a/src/chat/ListenerStartThread.java b/src/chat/ListenerStartThread.java new file mode 100644 index 0000000..4f77377 --- /dev/null +++ b/src/chat/ListenerStartThread.java @@ -0,0 +1,25 @@ +package chat; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.List; + +public class ListenerStartThread extends Thread { + + ServerSocket s; + List dest_sockets; + ListenerStartThread(ServerSocket in_s, List in_dest_sockets) + { + s = in_s; + dest_sockets = in_dest_sockets; + } + public void run() + { + try + { + dest_sockets.add(s.accept()); + } + catch(IOException e) {} + } +} \ No newline at end of file diff --git a/src/chat/Message.java b/src/chat/Message.java index 24c4083..6d4331b 100644 --- a/src/chat/Message.java +++ b/src/chat/Message.java @@ -3,16 +3,13 @@ package chat; import java.io.*; import java.util.*; -public class Message implements Serializable{ - +public class Message extends Notification { private String text; - private String author; - private Boolean redirected; - public Message(String in_author, String in_text, Boolean in_redirected) + Message (User in_author, String in_text, Boolean in_redirected) { - text = in_text; author = in_author; + text = in_text; redirected = in_redirected; } public void setText(String new_text) @@ -23,17 +20,4 @@ public class Message implements Serializable{ { return text; } - public void setAuthor(String new_author) - { - author = new_author; - } - public String getAuthor() - { - return author; - } - public Boolean isRedirected() - { - return redirected; - } -} - +} \ No newline at end of file diff --git a/src/chat/NetworkClient.java b/src/chat/NetworkClient.java index 067ee3b..53b6de0 100644 --- a/src/chat/NetworkClient.java +++ b/src/chat/NetworkClient.java @@ -14,387 +14,6 @@ import java.util.*; import chat.User; import chat.Message; -class OutdoorListenerThread extends Thread { - User user; - JTextArea displayArea; - JTextArea knownUsersPanel; - List known_users; - List known_outdoor_users; - List dest_sockets; - List outdoor_dest_sockets; - int portNumber; - -OutdoorListenerThread(User in_user, List in_known_users, List in_known_outdoor_users, List in_dest_sockets, List in_outdoor_dest_sockets, - JTextArea in_displayArea, JTextArea in_knownUsersPanel) - { - user = in_user; - known_users = in_known_users; - known_outdoor_users = in_known_outdoor_users; - dest_sockets = in_dest_sockets; - outdoor_dest_sockets = in_outdoor_dest_sockets; - displayArea = in_displayArea; - knownUsersPanel = in_knownUsersPanel; - portNumber = 2344; - } - public void run() - { - boolean exit = false; - boolean accepted = true; - - String notification; - String username; - String response = ""; - - byte[] buffer = new byte[100]; - DatagramPacket notifPacket = new DatagramPacket(buffer, buffer.length); - DatagramSocket notifSocket; - byte[] notifBytes; - - try - { - while(!exit) - { - try - { - ServerSocket servSocket = new ServerSocket(1233); - System.out.println("Waiting for connection request"); - Socket link = servSocket.accept(); - BufferedReader in = new BufferedReader(new InputStreamReader(link.getInputStream())); - PrintWriter out = new PrintWriter(link.getOutputStream(), true); - username = in.readLine(); - System.out.println("Received a request from " + username + "@" + link.getRemoteSocketAddress().toString()); - - response = ""; - for(User u:known_users) - { - response += u.getName() + " "; - } - response = response.trim(); - response += ";"; - for(User u:known_outdoor_users) - { - response += u.getName() + " "; - } - response = response.trim(); - response += ";" + (portNumber+1); - - out.println(response); - - accepted = true; - for(User a:known_users) - { - accepted = accepted && (!username.equals(a.getName())); - } - for(User a:known_outdoor_users) - { - accepted = accepted && (!username.equals(a.getName())); - } - if(accepted) - { - notification = "+" + username; - notifBytes = notification.getBytes(); - notifSocket = new DatagramSocket(); - notifPacket = new DatagramPacket(notifBytes, notifBytes.length, InetAddress.getByName("192.168.1.255"), 1234); - notifSocket.send(notifPacket); - - portNumber++; - Socket s = (new ServerSocket(portNumber)).accept(); - (new ReceiveThread(user, s, displayArea, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, true)).start(); - outdoor_dest_sockets.add(s); - } - servSocket.close(); - } - catch(SocketTimeoutException e) {} - } - } - catch(Exception e) - { - e.printStackTrace(); - System.out.println(e.getMessage()); - } - } -} - -class ReceiveThread extends Thread { - User user; - Socket socket; - JTextArea displayArea; - JTextArea knownUsersPanel; - Boolean isOutdoor; - List known_users; - List known_outdoor_users; - List dest_sockets; - List outdoor_dest_sockets; - - ReceiveThread(User in_user, Socket in_socket, JTextArea in_displayArea, List in_known_users, List in_known_outdoor_users, - JTextArea in_knownUsersPanel, List in_dest_sockets, List in_outdoor_dest_sockets, Boolean in_isOutdoor) - { - user = in_user; - socket = in_socket; - displayArea = in_displayArea; - knownUsersPanel = in_knownUsersPanel; - known_users = in_known_users; - known_outdoor_users = in_known_outdoor_users; - dest_sockets = in_dest_sockets; - outdoor_dest_sockets = in_outdoor_dest_sockets; - isOutdoor = in_isOutdoor; - } - public void run() - { - boolean exit = false; - try - { - while(!exit) - { - ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); - Message message = (Message) in.readObject(); - if(isOutdoor) - { - for(Socket s:dest_sockets) - { - try - { - ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); - out.writeObject(new Message(message.getAuthor(), message.getText(), true)); - } - catch(IOException e){} - } - } - else - { - if(message.getText() != null) - { - displayArea.append(message.getAuthor() + " : " + message.getText() + "\n"); - } - else - { - displayArea.append(message.getAuthor() + " has left the chat.\n"); - for(int i = 0;i < known_users.size();i ++) - { - if (known_users.get(i).getName().equals(message.getAuthor())) - { - known_users.remove(i); - break; - //System.out.println("Removing " + message.getAuthor()); - } - } - for(int i = 0;i < known_outdoor_users.size();i ++) - { - if (known_outdoor_users.get(i).getName().equals(message.getAuthor())) - { - known_outdoor_users.remove(i); - break; - //System.out.println("Removing " + message.getAuthor()); - } - } - - if(!message.isRedirected() && !message.getAuthor().equals(user.getName())) - { - socket.close(); - if(!isOutdoor) - dest_sockets.remove(socket); - else - outdoor_dest_sockets.remove(socket); - } - - 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()); - } - if(!message.getAuthor().equals(user.getName()) && !message.isRedirected()) - { - for(Socket s:outdoor_dest_sockets) - { - try - { - ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); - out.writeObject(new Message(message.getAuthor(), message.getText(), true)); - } - catch(IOException e){} - } - } - } - } - catch(EOFException e) {} - catch(Exception e) - { - e.printStackTrace(); - } - } -} - -class ConnectionListenerThread extends Thread { - User user; - JTextArea displayArea; - JTextArea knownUsersPanel; - List known_users; - List known_outdoor_users; - List dest_sockets; - List outdoor_dest_sockets; - int portNumber; - - ConnectionListenerThread(User in_user, List in_known_users, List in_known_outdoor_users, List in_dest_sockets, List in_outdoor_dest_sockets, - JTextArea in_displayArea, JTextArea in_knownUsersPanel, int in_portNumber) - { - user = in_user; - known_users = in_known_users; - known_outdoor_users = in_known_outdoor_users; - dest_sockets = in_dest_sockets; - outdoor_dest_sockets = in_outdoor_dest_sockets; - displayArea = in_displayArea; - knownUsersPanel = in_knownUsersPanel; - portNumber = in_portNumber; - } - public void run() - { - boolean exit = false; - boolean accepted = true; - boolean outdoor; - byte[] buffer = new byte[100]; - DatagramPacket request = new DatagramPacket(buffer, buffer.length); - DatagramPacket responsePacket; - - DatagramSocket requestSocket; - DatagramSocket responseSocket; - - String username; - String response = ""; - - byte[] responseBytes; - try - { - requestSocket = new DatagramSocket(1234); - responseSocket = new DatagramSocket(); - - while(!exit) - { - try - { - System.out.println("Waiting for connection request"); - requestSocket.receive(request); - username = new String(request.getData(), 0, request.getLength()); - - if(username.charAt(0) == '+') - { - username = username.substring(1); - outdoor = true; - } - else - { - outdoor = false; - InetAddress clientAddress= request.getAddress(); - System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress()); - - response = ""; - for(User u:known_users) - { - response += u.getName() + " "; - } - response = response.trim(); - response += ";"; - for(User u:known_outdoor_users) - { - response += u.getName() + " "; - } - response = response.trim(); - response += ";"; - for(Socket s:dest_sockets) - { - response += s.getInetAddress().getHostAddress() + " "; - } - response = response.trim(); - - response += ";" + (portNumber+1); - - System.out.println("Response :" + response); - responseBytes = response.getBytes(); - responsePacket = new DatagramPacket(responseBytes, responseBytes.length, clientAddress, 1337); - responseSocket.send(responsePacket); - } - accepted = true; - for(User a:known_users) - { - accepted = accepted && (!username.equals(a.getName())); - } - for(User a:known_outdoor_users) - { - accepted = accepted && (!username.equals(a.getName())); - } - if(accepted) - { - if(outdoor) - { - known_outdoor_users.add(new User(username)); - Collections.sort(known_outdoor_users); - } - else - { - portNumber++; - Socket s = (new ServerSocket(portNumber)).accept(); - (new ReceiveThread(user, s, displayArea, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start(); - dest_sockets.add(s); - - known_users.add(new User(username)); - - Collections.sort(known_users); - } - - displayArea.append(username + " has joined the chat.\n"); - displayArea.setCaretPosition(displayArea.getDocument().getLength()); - - 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"); - } - } - } - catch(SocketTimeoutException e) {} - } - } - catch(Exception e) - { - e.printStackTrace(); - System.out.println(e.getMessage()); - } - } -} - -class ListenerStartThread extends Thread { - - ServerSocket s; - List dest_sockets; - ListenerStartThread(ServerSocket in_s, List in_dest_sockets) - { - s = in_s; - dest_sockets = in_dest_sockets; - } - public void run() - { - try - { - dest_sockets.add(s.accept()); - } - catch(IOException e) {} - } -} - public class NetworkClient { private User user; private List known_users; @@ -506,6 +125,10 @@ public class NetworkClient { { known_users.add(new User (u)); } + for(String u:outdoorUsernameList) + { + known_outdoor_users.add(new User (u)); + } for(String a:addressList) { Socket s = new Socket(a, portNumber); @@ -571,32 +194,14 @@ public class NetworkClient { } user.setName(username); - if(!outdoor) - known_users.add(new User(username)); - else - known_outdoor_users.add(new User(username)); - Collections.sort(known_users); - chatText.append(username + " has joined the chat.\n"); - chatText.setCaretPosition(chatText.getDocument().getLength()); - - 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"); - } + send(new ConnectNotification(user, false, outdoor)); } return connected; } - void send (String message) + void send (Notification notif) { for(Socket s:dest_sockets) { @@ -604,7 +209,7 @@ public class NetworkClient { { //System.out.println(s.getInetAddress().getHostAddress() + ": local port " + s.getLocalPort() + ", remote port " + s.getPort()); ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); - out.writeObject(new Message(user.getName(), message, false)); + out.writeObject(notif); } catch(IOException e){} } @@ -614,7 +219,7 @@ public class NetworkClient { { //System.out.println(s.getInetAddress().getHostAddress() + ": local port " + s.getLocalPort() + ", remote port " + s.getPort()); ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); - out.writeObject(new Message(user.getName(), message, false)); + out.writeObject(notif); } catch(IOException e){} } @@ -622,7 +227,7 @@ public class NetworkClient { void disconnect() { - send(null); + send(new DisconnectNotification(user, false)); try { Thread.sleep(1000); @@ -638,4 +243,9 @@ public class NetworkClient { catch(IOException e){} } } + + User getUser() + { + return user; + } } diff --git a/src/chat/Notification.java b/src/chat/Notification.java new file mode 100644 index 0000000..ab148f6 --- /dev/null +++ b/src/chat/Notification.java @@ -0,0 +1,26 @@ +package chat; + +import java.io.Serializable; + +abstract class Notification implements Serializable{ + + protected User author; + protected Boolean redirected; + + public void setAuthor(User new_author) + { + author = new_author; + } + public User getAuthor() + { + return author; + } + public Boolean isRedirected() + { + return redirected; + } + public void setRedirected(Boolean in_redirected) + { + redirected = in_redirected; + } +} diff --git a/src/chat/OutdoorListenerThread.java b/src/chat/OutdoorListenerThread.java new file mode 100644 index 0000000..6a1bded --- /dev/null +++ b/src/chat/OutdoorListenerThread.java @@ -0,0 +1,115 @@ +package chat; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.ServerSocket; +import java.net.Socket; +import java.net.SocketTimeoutException; +import java.util.List; + +import javax.swing.JTextArea; + +class OutdoorListenerThread extends Thread { + User user; + JTextArea displayArea; + JTextArea knownUsersPanel; + List known_users; + List known_outdoor_users; + List dest_sockets; + List outdoor_dest_sockets; + int portNumber; + +OutdoorListenerThread(User in_user, List in_known_users, List in_known_outdoor_users, List in_dest_sockets, List in_outdoor_dest_sockets, + JTextArea in_displayArea, JTextArea in_knownUsersPanel) + { + user = in_user; + known_users = in_known_users; + known_outdoor_users = in_known_outdoor_users; + dest_sockets = in_dest_sockets; + outdoor_dest_sockets = in_outdoor_dest_sockets; + displayArea = in_displayArea; + knownUsersPanel = in_knownUsersPanel; + portNumber = 2344; + } + public void run() + { + boolean exit = false; + boolean accepted = true; + + String notification; + String username; + String response = ""; + + byte[] buffer = new byte[100]; + DatagramPacket notifPacket = new DatagramPacket(buffer, buffer.length); + DatagramSocket notifSocket; + byte[] notifBytes; + + try + { + while(!exit) + { + try + { + ServerSocket servSocket = new ServerSocket(1233); + System.out.println("Waiting for connection request"); + Socket link = servSocket.accept(); + BufferedReader in = new BufferedReader(new InputStreamReader(link.getInputStream())); + PrintWriter out = new PrintWriter(link.getOutputStream(), true); + username = in.readLine(); + System.out.println("Received a request from " + username + "@" + link.getRemoteSocketAddress().toString()); + + response = ""; + for(User u:known_users) + { + response += u.getName() + " "; + } + response = response.trim(); + response += ";"; + for(User u:known_outdoor_users) + { + response += u.getName() + " "; + } + response = response.trim(); + response += ";" + (portNumber+1); + + out.println(response); + + accepted = true; + for(User a:known_users) + { + accepted = accepted && (!username.equals(a.getName())); + } + for(User a:known_outdoor_users) + { + accepted = accepted && (!username.equals(a.getName())); + } + if(accepted) + { + notification = "+" + username; + notifBytes = notification.getBytes(); + notifSocket = new DatagramSocket(); + notifPacket = new DatagramPacket(notifBytes, notifBytes.length, InetAddress.getByName("192.168.1.255"), 1234); + notifSocket.send(notifPacket); + + portNumber++; + Socket s = (new ServerSocket(portNumber)).accept(); + (new ReceiveThread(user, s, displayArea, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, true)).start(); + outdoor_dest_sockets.add(s); + } + servSocket.close(); + } + catch(SocketTimeoutException e) {} + } + } + catch(Exception e) + { + e.printStackTrace(); + System.out.println(e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/chat/ReceiveThread.java b/src/chat/ReceiveThread.java new file mode 100644 index 0000000..5433eff --- /dev/null +++ b/src/chat/ReceiveThread.java @@ -0,0 +1,152 @@ +package chat; + +import java.io.EOFException; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.net.Socket; +import java.util.Collections; +import java.util.List; + +import javax.swing.JTextArea; + +class ReceiveThread extends Thread { + User user; + Socket socket; + JTextArea displayArea; + JTextArea knownUsersPanel; + Boolean isOutdoor; + List known_users; + List known_outdoor_users; + List dest_sockets; + List outdoor_dest_sockets; + + ReceiveThread(User in_user, Socket in_socket, JTextArea in_displayArea, List in_known_users, List in_known_outdoor_users, + JTextArea in_knownUsersPanel, List in_dest_sockets, List in_outdoor_dest_sockets, Boolean in_isOutdoor) + { + user = in_user; + socket = in_socket; + displayArea = in_displayArea; + knownUsersPanel = in_knownUsersPanel; + known_users = in_known_users; + known_outdoor_users = in_known_outdoor_users; + dest_sockets = in_dest_sockets; + outdoor_dest_sockets = in_outdoor_dest_sockets; + isOutdoor = in_isOutdoor; + } + public void run() + { + boolean exit = false; + try + { + while(!exit) + { + ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); + Notification notif = (Notification) in.readObject(); + + if(isOutdoor) + { + for(Socket s:dest_sockets) + { + try + { + ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); + notif.setRedirected(true); + out.writeObject(notif); + } + catch(IOException e){} + } + } + else + { + if(notif instanceof Message) + { + Message m = (Message) notif; + displayArea.append(m.getAuthor() + " : " + m.getText() + "\n"); + } + else if (notif instanceof DisconnectNotification) + { + DisconnectNotification dn = (DisconnectNotification) notif; + + displayArea.append(dn.getAuthor().getName() + " has left the chat.\n"); + for(int i = 0;i < known_users.size();i ++) + { + if (known_users.get(i).getName().equals(dn.getAuthor())) + { + known_users.remove(i); + break; + //System.out.println("Removing " + message.getAuthor()); + } + } + for(int i = 0;i < known_outdoor_users.size();i ++) + { + if (known_outdoor_users.get(i).getName().equals(dn.getAuthor())) + { + known_outdoor_users.remove(i); + break; + //System.out.println("Removing " + message.getAuthor()); + } + } + + if(!dn.isRedirected() && !dn.getAuthor().equals(user.getName())) + { + 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()) + { + known_outdoor_users.add(cn.getAuthor()); + Collections.sort(known_outdoor_users); + } + else + { + 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()); + } + if(!notif.getAuthor().equals(user.getName()) && !notif.isRedirected()) + { + for(Socket s:outdoor_dest_sockets) + { + try + { + ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); + notif.setRedirected(true); + out.writeObject(notif); + } + catch(IOException e){} + } + } + } + } + catch(EOFException e) {} + catch(Exception e) + { + e.printStackTrace(); + } + } +}