package chat; import java.net.*; import javax.swing.*; import java.awt.*; import java.util.List; import java.awt.event.*; import java.io.*; import java.util.*; import chat.User; import chat.Message; //class SendThread extends Thread { // String address; // Message message; // int port; // // SendThread(Message in_message, String in_address, int in_port) // { // message = in_message; // address = in_address; // port = in_port; // } // public void run() // { // Socket link; // boolean connected = false; // ObjectOutputStream out; // // while(!connected) // { // try // { // link = new Socket(address, port); // out = new ObjectOutputStream(link.getOutputStream()); // out.writeObject(message); // connected = true; // } // catch(IOException e) // { // e.printStackTrace(); // connected = false; // } // } // // } //} class ReceiveThread extends Thread { Socket socket; JTextArea displayArea; JTextArea knownUsersPanel; List known_users; List dest_sockets; ReceiveThread(Socket in_socket, JTextArea in_displayArea, List in_known_users, JTextArea in_knownUsersPanel, List in_dest_sockets) { socket = in_socket; displayArea = in_displayArea; knownUsersPanel = in_knownUsersPanel; known_users = in_known_users; dest_sockets = in_dest_sockets; } public void run() { boolean exit = false; try { while(!exit) { ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); Message message = (Message) in.readObject(); 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()); } } knownUsersPanel.setText(""); knownUsersPanel.append("Online:\n"); for(User u:known_users) { knownUsersPanel.append(" " + u.getName() + " \n"); } exit = true; } displayArea.setCaretPosition(displayArea.getDocument().getLength()); } socket.close(); dest_sockets.remove(socket); } catch(Exception e) { e.printStackTrace(); } } } class ConnectionListenerThread extends Thread { JTextArea displayArea; JTextArea knownUsersPanel; List known_users; List dest_sockets; ConnectionListenerThread(List in_known_users, List in_dest_sockets, JTextArea in_displayArea, JTextArea in_knownUsersPanel) { known_users = in_known_users; dest_sockets = in_dest_sockets; displayArea = in_displayArea; knownUsersPanel = in_knownUsersPanel; } public void run() { boolean exit = false; boolean accepted = true; 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(Socket s:dest_sockets) { response += s.getInetAddress().getHostAddress() + " "; } response = response.trim(); 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())); } if(accepted) { Socket s = (new ServerSocket(1237+(known_users.size()))).accept(); (new ReceiveThread(s, displayArea, known_users, knownUsersPanel, dest_sockets)).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"); for(User a:known_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; private List dest_sockets; private JTextArea chatText; private JTextArea knownUsersPanel; static String getLocalIP() { String ip = ""; try(final DatagramSocket socket = new DatagramSocket()){ socket.connect(InetAddress.getByName("8.8.8.8"), 10002); ip = socket.getLocalAddress().getHostAddress(); } catch(Exception e) { System.out.println("niiiiiiiikkk"); } return ip; } NetworkClient(JTextArea in_chatText, JTextArea in_knownUsersPanel) { user = new User(""); chatText = in_chatText; knownUsersPanel = in_knownUsersPanel; known_users = new ArrayList(); dest_sockets = new ArrayList(); } boolean connect(String username) { boolean nameAvailable = true; boolean connected = false; DatagramSocket connectionSocket; DatagramSocket userListSocket; DatagramPacket connectionRequest; DatagramPacket responsePacket; byte[] buffer1 = new byte[20000]; if(username == null || username.compareTo("") == 0) return false; try { connectionSocket = new DatagramSocket(); userListSocket = new DatagramSocket(1337); userListSocket.setSoTimeout(500); connectionRequest = new DatagramPacket(username.getBytes(), username.length(), InetAddress.getByName("25.255.255.255"), 1234); 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()).split(";"); String[] usernameList = response[0].split(" "); String[] addressList = response[1].split(" "); for(String u:usernameList) { nameAvailable = nameAvailable && (!username.equals(u)); } if(nameAvailable) { System.out.println(usernameList.length + " users currently connected"); for(String u:usernameList) { known_users.add(new User (u)); } for(String a:addressList) { Socket s = new Socket(a, (1237+usernameList.length)); dest_sockets.add(s); (new ReceiveThread(s, chatText, known_users, knownUsersPanel, dest_sockets)).start(); } Collections.sort(known_users); connected = true; } } catch(SocketTimeoutException e) //Si on est tout seul sur le réseau (on ne reçoit aucune réponse) { System.out.println("Reply timed out"); connected = true; } connectionSocket.close(); userListSocket.close(); } catch (SocketException e2) { e2.printStackTrace(); } catch (Exception e3) { System.out.println(e3.getMessage()); } if(connected) { (new ConnectionListenerThread(known_users, dest_sockets, chatText, knownUsersPanel)).start(); try { ServerSocket s1 = new ServerSocket(1237+(known_users.size())); (new ListenerStartThread(s1, dest_sockets)).start(); Socket s2 = new Socket("25.67.234.235", 1237+(known_users.size())); (new ReceiveThread(s2, chatText, known_users, knownUsersPanel, dest_sockets)).start(); } catch(IOException e) { e.printStackTrace(); } user.setName(username); known_users.add(new User(username)); chatText.append(username + " has joined the chat.\n"); chatText.setCaretPosition(chatText.getDocument().getLength()); knownUsersPanel.setText(""); knownUsersPanel.append(" Online :\n"); for(User a:known_users) { knownUsersPanel.append(" " + a.getName() + " \n"); } } return connected; } void send (String message) { // for(User recipient:known_users) // { // SendThread t1 = new SendThread(new Message(user.getName(), message), recipient.getAddress(), 1237); // t1.start(); // } for(Socket s:dest_sockets) { try { ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); out.writeObject(new Message(user.getName(), message)); } catch(IOException e){} } } void disconnect() { send(null); for(Socket s:dest_sockets) { try { s.close(); } catch(IOException e){} } } }