From 1348dc96ed764b2f7596fc179dc13ff04684dc60 Mon Sep 17 00:00:00 2001 From: Metatheria Date: Sat, 13 Feb 2021 19:43:54 +0100 Subject: [PATCH] ajout des outdoor users(1) --- src/chat/ClientWindow.java | 55 +++++++--- src/chat/NetworkClient.java | 193 +++++++++++++++++++++++++++++------- 2 files changed, 198 insertions(+), 50 deletions(-) diff --git a/src/chat/ClientWindow.java b/src/chat/ClientWindow.java index 0681b14..1a8607d 100644 --- a/src/chat/ClientWindow.java +++ b/src/chat/ClientWindow.java @@ -29,8 +29,12 @@ public class ClientWindow implements ActionListener { ClientWindow() { - boolean connected = false; + Boolean connected = false; + Boolean outdoor = false; + Boolean exit = false; String username = ""; + String destinationIP = ""; + chatWindow = new JFrame("Système de clavardage 2.0.1"); chatPanel = new JPanel(new BorderLayout(2, 2)); @@ -44,24 +48,49 @@ public class ClientWindow implements ActionListener { network = new NetworkClient(chatText, knownUsersPanel); - while(!connected && username != null) + while(!connected && !exit) { - username = JOptionPane.showInputDialog(chatWindow, - "Enter a username", - "Login", - JOptionPane.PLAIN_MESSAGE); + Object[] options = {"Connect as indoor user", "Connect as outdoor user"}; + int n = JOptionPane.showOptionDialog(chatWindow, "", "Choose Login Method", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]); - connected = network.connect(username); - if(!connected && username != null) + if(n == JOptionPane.YES_OPTION) { - if(username.equals("")) - JOptionPane.showMessageDialog(chatWindow, "Please enter a username", "Error", JOptionPane.ERROR_MESSAGE); - else - JOptionPane.showMessageDialog(chatWindow, "This username is already taken", "Error", JOptionPane.ERROR_MESSAGE); + outdoor = false; + destinationIP = "192.168.1.255"; + } + else if (n == JOptionPane.NO_OPTION) + { + outdoor = true; + destinationIP = JOptionPane.showInputDialog(chatWindow, + "Enter the server's IP address", + "Enter Server Address", + JOptionPane.PLAIN_MESSAGE); + } + else + { + exit = true; + } + + + if((!outdoor || (destinationIP != null)) && !exit) + { + username = JOptionPane.showInputDialog(chatWindow, + "Enter a username", + "Choose Username", + JOptionPane.PLAIN_MESSAGE); + + connected = network.connect(username, false, "192.168.1.255"); + if(!connected && username != null) + { + if(username.equals("")) + JOptionPane.showMessageDialog(chatWindow, "Please enter a username", "Error", JOptionPane.ERROR_MESSAGE); + else + JOptionPane.showMessageDialog(chatWindow, "This username is already taken", "Error", JOptionPane.ERROR_MESSAGE); + } } } - if(username != null) + if(username != null && !exit) { sendButton.addActionListener(this); messageField.addActionListener(this); diff --git a/src/chat/NetworkClient.java b/src/chat/NetworkClient.java index 254dfd8..108cceb 100644 --- a/src/chat/NetworkClient.java +++ b/src/chat/NetworkClient.java @@ -15,7 +15,25 @@ import chat.User; import chat.Message; /*class OutdoorUserListenerThread extends Thread { - + OutdoorUserListenerThread() + { + + } + public void run() + { + byte[] buffer = new byte[100]; + DatagramPacket request = new DatagramPacket(buffer, buffer.length); + DatagramSocket requestSocket; + try + { + requestSocket = new DatagramSocket(1233); + requestSocket.receive(request) + } + catch(Exception e) + { + e.printStackTrace(); + } + } }*/ class ReceiveThread extends Thread { @@ -23,10 +41,13 @@ class ReceiveThread extends Thread { Socket socket; JTextArea displayArea; JTextArea knownUsersPanel; + Boolean isOutdoor; List known_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) + 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) { user = in_user; socket = in_socket; @@ -34,6 +55,8 @@ class ReceiveThread extends Thread { knownUsersPanel = in_knownUsersPanel; known_users = in_known_users; dest_sockets = in_dest_sockets; + outdoor_dest_sockets = in_outdoor_dest_sockets; + isOutdoor = in_isOutdoor; } public void run() { @@ -47,6 +70,7 @@ class ReceiveThread extends Thread { if(message.getText() != null) { displayArea.append(message.getAuthor() + " : " + message.getText() + "\n"); + } else { @@ -70,11 +94,37 @@ class ReceiveThread extends Thread { if(!message.getAuthor().equals(user.getName())) { socket.close(); + if(!isOutdoor) dest_sockets.remove(socket); + else + outdoor_dest_sockets.remove(socket); } exit = true; } + displayArea.setCaretPosition(displayArea.getDocument().getLength()); + if(isOutdoor) + { + for(Socket s:dest_sockets) + { + try + { + ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); + out.writeObject(message); + } + catch(IOException e){} + } + } + + for(Socket s:outdoor_dest_sockets) + { + try + { + ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); + out.writeObject(message); + } + catch(IOException e){} + } } @@ -93,16 +143,21 @@ class ConnectionListenerThread extends Thread { JTextArea knownUsersPanel; List known_users; List dest_sockets; + List outdoor_dest_sockets; int portNumber; + int outdoorPortNumber; - ConnectionListenerThread(User in_user, List in_known_users, List in_dest_sockets, JTextArea in_displayArea, JTextArea in_knownUsersPanel, int in_portNumber) + ConnectionListenerThread(User in_user, List in_known_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; dest_sockets = in_dest_sockets; + outdoor_dest_sockets = in_dest_sockets; displayArea = in_displayArea; knownUsersPanel = in_knownUsersPanel; portNumber = in_portNumber; + outdoorPortNumber = 2344; } public void run() { @@ -115,6 +170,8 @@ class ConnectionListenerThread extends Thread { DatagramSocket requestSocket; DatagramSocket responseSocket; + String requestStrings[]; + String outdoorFlag; String username; String response = ""; @@ -130,23 +187,31 @@ class ConnectionListenerThread extends Thread { { System.out.println("Waiting for connection request"); requestSocket.receive(request); - username = new String(request.getData(), 0, request.getLength()); + requestStrings = (new String(request.getData(), 0, request.getLength())).split(" "); + username = requestStrings[0]; + outdoorFlag = requestStrings[1]; 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) + if(outdoorFlag.equals("i")) { - response += s.getInetAddress().getHostAddress() + " "; + response += ";"; + for(Socket s:dest_sockets) + { + response += s.getInetAddress().getHostAddress() + " "; + } + response = response.trim(); + response += ";" + (portNumber+1); } - response = response.trim(); - response += ";" + (portNumber+1); + else + response += ";" + (outdoorPortNumber+1); System.out.println("Response :" + response); responseBytes = response.getBytes(); @@ -160,10 +225,20 @@ class ConnectionListenerThread extends Thread { } if(accepted) { - portNumber++; - Socket s = (new ServerSocket(portNumber)).accept(); - (new ReceiveThread(user, s, displayArea, known_users, knownUsersPanel, dest_sockets)).start(); - dest_sockets.add(s); + if(outdoorFlag.equals("i")) + { + portNumber++; + Socket s = (new ServerSocket(portNumber)).accept(); + (new ReceiveThread(user, s, displayArea, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start(); + dest_sockets.add(s); + } + else + { + outdoorPortNumber++; + Socket s = (new ServerSocket(outdoorPortNumber)).accept(); + (new ReceiveThread(user, s, displayArea, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, true)).start(); + dest_sockets.add(s); + } known_users.add(new User(username)); @@ -213,6 +288,7 @@ public class NetworkClient { private User user; private List known_users; private List dest_sockets; + private List outdoor_dest_sockets; private JTextArea chatText; private JTextArea knownUsersPanel; @@ -236,9 +312,10 @@ public class NetworkClient { knownUsersPanel = in_knownUsersPanel; known_users = new ArrayList(); dest_sockets = new ArrayList(); + outdoor_dest_sockets = new ArrayList(); } - boolean connect(String username) + boolean connect(String username, Boolean outdoor, String destinationIP) { boolean nameAvailable = true; boolean connected = false; @@ -247,6 +324,11 @@ public class NetworkClient { DatagramPacket connectionRequest; DatagramPacket responsePacket; + + String requestString; + + String[] usernameList; + String[] addressList; int portNumber = 1237; byte[] buffer1 = new byte[20000]; @@ -261,8 +343,13 @@ public class NetworkClient { userListSocket.setSoTimeout(500); - connectionRequest = new DatagramPacket(username.getBytes(), username.length(), - InetAddress.getByName("192.168.1.255"), 1234); + if(outdoor) + requestString = username + " o"; + else + requestString = username + " i"; + + connectionRequest = new DatagramPacket(requestString.getBytes(), requestString.length(), + InetAddress.getByName(destinationIP), 1234); /*l'adresse de broadcast est hardcodée ici pour tester avec Hamachi, il faut la remplacer par celle du réseau local virtuel*/ System.out.println("Sending connection request"); @@ -275,13 +362,21 @@ public class NetworkClient { System.out.println("Waiting for reply"); userListSocket.receive(responsePacket); System.out.println("Received a reply from " + responsePacket.getAddress().getHostAddress()); - + String[] response = new String(responsePacket.getData()).trim().split(";"); - String[] usernameList = response[0].split(" "); - String[] addressList = response[1].split(" "); - System.out.println (response[2].length()); - portNumber = Integer.parseInt(response[2]); + usernameList = response[0].split(" "); + if(!outdoor) + { + addressList = response[1].split(" "); + System.out.println (response[2].length()); + portNumber = Integer.parseInt(response[2]); + } + else + { + addressList = new String[0]; + portNumber = Integer.parseInt(response[1]); + } for(String u:usernameList) @@ -299,7 +394,7 @@ public class NetworkClient { { Socket s = new Socket(a, portNumber); dest_sockets.add(s); - (new ReceiveThread(user, s, chatText, known_users, knownUsersPanel, dest_sockets)).start(); + (new ReceiveThread(user, s, chatText, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start(); } Collections.sort(known_users); connected = true; @@ -326,24 +421,38 @@ public class NetworkClient { if(connected) { - - (new ConnectionListenerThread(user, known_users, dest_sockets, chatText, knownUsersPanel, portNumber)).start(); - - try + if(!outdoor) { - ServerSocket s1 = new ServerSocket(portNumber); - (new ListenerStartThread(s1, dest_sockets)).start(); - - Socket s2 = new Socket(getLocalIP(), portNumber); - System.out.println(getLocalIP()); - /*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)).start(); + (new ConnectionListenerThread(user, known_users, dest_sockets, outdoor_dest_sockets, chatText, knownUsersPanel, portNumber)).start(); + + try + { + ServerSocket s1 = new ServerSocket(portNumber); + (new ListenerStartThread(s1, dest_sockets)).start(); + + Socket s2 = new Socket(getLocalIP(), portNumber); + System.out.println(getLocalIP()); + /*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)).start(); + } + catch(IOException e) + { + e.printStackTrace(); + } } - catch(IOException e) + else { - e.printStackTrace(); + try + { + Socket s = new Socket("0.0.0.0", portNumber); + dest_sockets.add(s); + } + catch(IOException e) + { + e.printStackTrace(); + } } user.setName(username); @@ -376,6 +485,16 @@ public class NetworkClient { } catch(IOException e){} } + 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){} + } } void disconnect()