From 9c77df53a80e5da291d39d4262f7540e001f854e Mon Sep 17 00:00:00 2001 From: Metatheria Date: Sat, 13 Feb 2021 23:13:28 +0100 Subject: [PATCH] outdoor users(3) --- src/chat/ClientWindow.java | 2 +- src/chat/NetworkClient.java | 225 ++++++++++++++++++++++++------------ 2 files changed, 153 insertions(+), 74 deletions(-) diff --git a/src/chat/ClientWindow.java b/src/chat/ClientWindow.java index 1a8607d..b7d7686 100644 --- a/src/chat/ClientWindow.java +++ b/src/chat/ClientWindow.java @@ -79,7 +79,7 @@ public class ClientWindow implements ActionListener { "Choose Username", JOptionPane.PLAIN_MESSAGE); - connected = network.connect(username, false, "192.168.1.255"); + connected = network.connect(username, outdoor, destinationIP); if(!connected && username != null) { if(username.equals("")) diff --git a/src/chat/NetworkClient.java b/src/chat/NetworkClient.java index 1edceca..d4c299d 100644 --- a/src/chat/NetworkClient.java +++ b/src/chat/NetworkClient.java @@ -14,6 +14,105 @@ import java.util.*; import chat.User; import chat.Message; +class OutdoorListenerThread extends Thread { + User user; + JTextArea displayArea; + JTextArea knownUsersPanel; + List known_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, + JTextArea in_displayArea, JTextArea in_knownUsersPanel) + { + user = in_user; + known_users = in_known_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; + byte[] buffer = new byte[100]; + + + String username; + String response = ""; + + byte[] responseBytes; + try + { + while(!exit) + { + try + { + System.out.println("Waiting for connection request"); + ServerSocket servSocket = new ServerSocket(1234); + 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(Socket s:dest_sockets) + { + response += s.getInetAddress().getHostAddress() + " "; + } + response = response.trim(); + response += ";" + (portNumber+1); + + out.println(response); + + accepted = true; + for(User a:known_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)).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"); + } + } + } + catch(SocketTimeoutException e) {} + } + } + catch(Exception e) + { + e.printStackTrace(); + System.out.println(e.getMessage()); + } + } +} + + class ReceiveThread extends Thread { User user; Socket socket; @@ -123,7 +222,6 @@ class ConnectionListenerThread extends Thread { List dest_sockets; List outdoor_dest_sockets; int portNumber; - int outdoorPortNumber; 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) @@ -135,7 +233,6 @@ class ConnectionListenerThread extends Thread { displayArea = in_displayArea; knownUsersPanel = in_knownUsersPanel; portNumber = in_portNumber; - outdoorPortNumber = 2344; } public void run() { @@ -148,8 +245,6 @@ class ConnectionListenerThread extends Thread { DatagramSocket requestSocket; DatagramSocket responseSocket; - String requestStrings[]; - String outdoorFlag; String username; String response = ""; @@ -165,31 +260,24 @@ class ConnectionListenerThread extends Thread { { System.out.println("Waiting for connection request"); requestSocket.receive(request); - requestStrings = (new String(request.getData(), 0, request.getLength())).split(" "); - username = requestStrings[0]; - outdoorFlag = requestStrings[1]; + 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) { response += u.getName() + " "; } response = response.trim(); - if(outdoorFlag.equals("i")) + response += ";"; + for(Socket s:dest_sockets) { - response += ";"; - for(Socket s:dest_sockets) - { - response += s.getInetAddress().getHostAddress() + " "; - } - response = response.trim(); - response += ";" + (portNumber+1); + response += s.getInetAddress().getHostAddress() + " "; } - else - response += ";" + (outdoorPortNumber+1); + response = response.trim(); + response += ";" + (portNumber+1); System.out.println("Response :" + response); responseBytes = response.getBytes(); @@ -203,20 +291,11 @@ class ConnectionListenerThread extends Thread { } if(accepted) { - 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); - } + 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); + known_users.add(new User(username)); @@ -303,8 +382,6 @@ public class NetworkClient { DatagramPacket connectionRequest; DatagramPacket responsePacket; - String requestString; - String[] usernameList; String[] addressList; @@ -315,47 +392,51 @@ public class NetworkClient { return false; try - { - connectionSocket = new DatagramSocket(); - userListSocket = new DatagramSocket(1337); - - userListSocket.setSoTimeout(500); - - 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"); - connectionSocket.send(connectionRequest); - + { try { - responsePacket = new DatagramPacket(buffer1, buffer1.length); - - 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(";"); - - usernameList = response[0].split(" "); if(!outdoor) { - addressList = response[1].split(" "); - System.out.println (response[2].length()); - portNumber = Integer.parseInt(response[2]); + connectionSocket = new DatagramSocket(); + userListSocket = new DatagramSocket(1337); + + userListSocket.setSoTimeout(500); + + connectionRequest = new DatagramPacket(username.getBytes(), username.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"); + connectionSocket.send(connectionRequest); + + responsePacket = new DatagramPacket(buffer1, buffer1.length); + + 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(";"); + + usernameList = response[0].split(" "); + addressList = response[1].split(" "); + portNumber = Integer.parseInt(response[2]); + + connectionSocket.close(); + userListSocket.close(); } - else - { - addressList = new String[0]; - portNumber = Integer.parseInt(response[1]); - } - + + else + { + Socket requestSocket = new Socket(destinationIP, 1234); + BufferedReader in = new BufferedReader(new InputStreamReader(requestSocket.getInputStream())); + PrintWriter out = new PrintWriter(requestSocket.getOutputStream(), true); + out.println(username); + String[] response = in.readLine().split(";"); + usernameList = response[0].split(" "); + addressList = new String[0]; + portNumber = Integer.parseInt(response[2]); + requestSocket.close(); + } for(String u:usernameList) { @@ -384,9 +465,6 @@ public class NetworkClient { System.out.println("Reply timed out"); connected = true; } - - connectionSocket.close(); - userListSocket.close(); } catch (SocketException e2) { @@ -402,6 +480,7 @@ 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(); try {