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()); 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) { 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()); } } }