From 1edff06f815a85a3acf0ce37a71366ed6d5a2222 Mon Sep 17 00:00:00 2001 From: Metatheria Date: Sun, 14 Feb 2021 21:39:42 +0100 Subject: [PATCH] outdoor users(6) --- src/chat/Message.java | 8 +- src/chat/NetworkClient.java | 242 +++++++++++++++++++++--------------- 2 files changed, 151 insertions(+), 99 deletions(-) diff --git a/src/chat/Message.java b/src/chat/Message.java index b9316c0..24c4083 100644 --- a/src/chat/Message.java +++ b/src/chat/Message.java @@ -7,11 +7,13 @@ public class Message implements Serializable{ private String text; private String author; + private Boolean redirected; - public Message(String in_author, String in_text) + public Message(String in_author, String in_text, Boolean in_redirected) { text = in_text; author = in_author; + redirected = in_redirected; } public void setText(String new_text) { @@ -29,5 +31,9 @@ public class Message implements Serializable{ { return author; } + public Boolean isRedirected() + { + return redirected; + } } diff --git a/src/chat/NetworkClient.java b/src/chat/NetworkClient.java index ef28a93..20fa3bc 100644 --- a/src/chat/NetworkClient.java +++ b/src/chat/NetworkClient.java @@ -19,15 +19,17 @@ class OutdoorListenerThread extends Thread { 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_dest_sockets, List in_outdoor_dest_sockets, +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; @@ -39,10 +41,15 @@ class OutdoorListenerThread extends Thread { 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) @@ -64,6 +71,11 @@ class OutdoorListenerThread extends Thread { } response = response.trim(); response += ";"; + for(User u:known_outdoor_users) + { + response += u.getName() + " "; + } + response = response.trim(); for(Socket s:dest_sockets) { response += s.getInetAddress().getHostAddress() + " "; @@ -78,25 +90,22 @@ class OutdoorListenerThread extends Thread { { 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, knownUsersPanel, dest_sockets, outdoor_dest_sockets, true, false)).start(); + (new ReceiveThread(user, s, displayArea, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, true)).start(); outdoor_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("Online:\n"); - for(User a:known_users) - { - knownUsersPanel.append(" " + a.getName() + " \n"); - } } servSocket.close(); } @@ -111,30 +120,29 @@ class OutdoorListenerThread extends Thread { } } - class ReceiveThread extends Thread { User user; Socket socket; JTextArea displayArea; JTextArea knownUsersPanel; Boolean isOutdoor; - Boolean self; 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, JTextArea in_knownUsersPanel, - List in_dest_sockets, List in_outdoor_dest_sockets, Boolean in_isOutdoor, Boolean in_self) + 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; - self = in_self; } public void run() { @@ -152,7 +160,7 @@ class ReceiveThread extends Thread { try { ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); - out.writeObject(message); + out.writeObject(new Message(message.getAuthor(), message.getText(), true)); } catch(IOException e){} } @@ -162,14 +170,12 @@ class ReceiveThread extends Thread { 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); @@ -177,39 +183,52 @@ class ReceiveThread extends Thread { //System.out.println("Removing " + message.getAuthor()); } } - knownUsersPanel.setText(""); - knownUsersPanel.append("Online:\n"); - for(User u:known_users) + for(int i = 0;i < known_outdoor_users.size();i ++) { - knownUsersPanel.append(" " + u.getName() + " \n"); - } - if(!self) - { - socket.close(); - if(!isOutdoor) - dest_sockets.remove(socket); - else - outdoor_dest_sockets.remove(socket); + 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() != 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(!self) - { - for(Socket s:outdoor_dest_sockets) - { - try - { - ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); - out.writeObject(message); - } - catch(IOException e){} - } - } - } + if(message.getAuthor() != user.getName()) + { + 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) @@ -224,11 +243,12 @@ class ConnectionListenerThread extends Thread { 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_dest_sockets, List in_outdoor_dest_sockets, + 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; @@ -243,6 +263,7 @@ class ConnectionListenerThread extends Thread { { boolean exit = false; boolean accepted = true; + boolean outdoor; byte[] buffer = new byte[100]; DatagramPacket request = new DatagramPacket(buffer, buffer.length); DatagramPacket responsePacket; @@ -267,50 +288,75 @@ class ConnectionListenerThread extends Thread { requestSocket.receive(request); username = new String(request.getData(), 0, request.getLength()); - InetAddress clientAddress= request.getAddress(); - System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress()); - - response = ""; - for(User u:known_users) + if(username.charAt(0) == '+') { - response += u.getName() + " "; + username = username.substring(1); + outdoor = true; } - response = response.trim(); - response += ";"; - for(Socket s:dest_sockets) + else { - response += s.getInetAddress().getHostAddress() + " "; + 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(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); } - 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) { - portNumber++; - Socket s = (new ServerSocket(portNumber)).accept(); - (new ReceiveThread(user, s, displayArea, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false, false)).start(); - dest_sockets.add(s); - - - known_users.add(new User(username)); - - Collections.sort(known_users); + 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("Online:\n"); + 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"); } @@ -349,6 +395,7 @@ class ListenerStartThread extends Thread { public class NetworkClient { private User user; private List known_users; + private List known_outdoor_users; private List dest_sockets; private List outdoor_dest_sockets; private JTextArea chatText; @@ -373,6 +420,7 @@ public class NetworkClient { chatText = in_chatText; knownUsersPanel = in_knownUsersPanel; known_users = new ArrayList(); + known_outdoor_users = new ArrayList(); dest_sockets = new ArrayList(); outdoor_dest_sockets = new ArrayList(); } @@ -456,7 +504,7 @@ public class NetworkClient { { Socket s = new Socket(a, portNumber); dest_sockets.add(s); - (new ReceiveThread(user, s, chatText, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false, false)).start(); + (new ReceiveThread(user, s, chatText, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start(); } Collections.sort(known_users); connected = true; @@ -482,8 +530,8 @@ public class NetworkClient { { if(!outdoor) { - (new ConnectionListenerThread(user, known_users, dest_sockets, outdoor_dest_sockets, chatText, knownUsersPanel, portNumber)).start(); - (new OutdoorListenerThread(user, known_users, dest_sockets, outdoor_dest_sockets, chatText, knownUsersPanel)).start(); + (new ConnectionListenerThread(user, known_users, known_outdoor_users, dest_sockets, outdoor_dest_sockets, chatText, knownUsersPanel, portNumber)).start(); + (new OutdoorListenerThread(user, known_users, known_outdoor_users, dest_sockets, outdoor_dest_sockets, chatText, knownUsersPanel)).start(); try { @@ -495,7 +543,7 @@ public class NetworkClient { /*Attention, getLocalIP ne marche que sur un même réseau physique * pour tester avec Hamachi, il faut hardcoder les IP */ - (new ReceiveThread(user, s2, chatText, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false, true)).start(); + (new ReceiveThread(user, s2, chatText, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start(); } catch(IOException e) { @@ -508,7 +556,7 @@ public class NetworkClient { { Socket s = new Socket(destinationIP, portNumber); dest_sockets.add(s); - (new ReceiveThread(user, s, chatText, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false, false)).start(); + (new ReceiveThread(user, s, chatText, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start(); } catch(IOException e) { @@ -538,26 +586,24 @@ public class NetworkClient { { for(Socket s:dest_sockets) { - System.out.println("Indoor users:"); try { - System.out.println(s.getInetAddress().getHostAddress() + ": local port " + s.getLocalPort() + ", remote port " + s.getPort()); + //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)); + out.writeObject(new Message(user.getName(), message, false)); } catch(IOException e){} } - System.out.println("Outdoor users:"); for(Socket s:outdoor_dest_sockets) - { - try - { - 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)); - } - catch(IOException e){} - } + { + try + { + //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)); + } + catch(IOException e){} + } } void disconnect()