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 { int port; JTextArea displayArea; List known_users; ReceiveThread(int in_port, JTextArea in_displayArea, List in_known_users) { port = in_port; displayArea = in_displayArea; known_users = in_known_users; } public void run() { try { ServerSocket servSocket = new ServerSocket(port); boolean exit = false; while(!exit) { try { Socket link = servSocket.accept(); ObjectInputStream in = new ObjectInputStream(link.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); } } displayArea.setCaretPosition(displayArea.getDocument().getLength()); link.close(); } catch(Exception e) { } } } catch(IOException e) { System.out.println("nik2 !"); } } } class ConnectionListenerThread extends Thread { JTextArea displayArea; List known_users; ConnectionListenerThread(List in_known_users, JTextArea in_displayArea) { known_users = in_known_users; displayArea = in_displayArea; } 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; ByteArrayOutputStream bStream; ObjectOutput oo; String username; byte[] response1; try { requestSocket = new DatagramSocket(1234); responseSocket = new DatagramSocket(); while(!exit) { try { bStream = new ByteArrayOutputStream(); oo = new ObjectOutputStream(bStream); 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()); System.out.println("Response:"); for(User user:known_users) { System.out.println(user.getName() + ":" + user.getAddress()); } oo.writeObject(known_users); response1 = bStream.toByteArray(); responsePacket = new DatagramPacket(response1, response1.length, clientAddress, 1337); responseSocket.send(responsePacket); accepted = true; for(User a:known_users) { accepted = accepted && (!username.equals(a.getName())); } if(accepted) { known_users.add(new User(username, clientAddress.getHostAddress())); displayArea.append(username + " has joined the chat.\n"); displayArea.setCaretPosition(displayArea.getDocument().getLength()); } else { System.out.println("Username already taken"); } } catch(SocketTimeoutException e) {} } } catch(Exception e) { e.printStackTrace(); System.out.println(e.getMessage()); } } } public class NetworkClient { private User user; private List known_users; private JTextArea chatText; 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) { user = new User("", ""); chatText = in_chatText; known_users = new ArrayList(); } boolean connect(String username) { boolean nameAvailable = true; boolean connected = false; DatagramSocket connectionSocket; DatagramSocket userListSocket; DatagramPacket connectionRequest; DatagramPacket userListPacket; ObjectInputStream userListStream; ArrayList userList; 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 { userListPacket = new DatagramPacket(buffer1, buffer1.length); System.out.println("Waiting for reply"); userListSocket.receive(userListPacket); System.out.println("Received a reply from " + userListPacket.getAddress().getHostAddress()); userListStream = new ObjectInputStream(new ByteArrayInputStream(userListPacket.getData())); userList = (ArrayList) userListStream.readObject(); for(User a:userList) { nameAvailable = nameAvailable && (!username.equals(a.getName())); } if(nameAvailable) { System.out.println(userList.size() + " users currently connected"); for(int i = 0;i < userList.size();i ++) { System.out.println(userList.get(i).getName() + " : " + userList.get(i).getAddress()); known_users.add(userList.get(i)); } known_users.add(new User(username, "25.67.234.235")); connected = true; } } catch(SocketTimeoutException e) { known_users.add(new User(username, "25.67.234.235")); System.out.println("Reply timed out"); connected = true; } connectionSocket.close(); userListSocket.close(); } catch (SocketException e2) { System.out.println(e2.getMessage()); } catch (Exception e3) { System.out.println(e3.getMessage()); } if(connected) { user.setName(username); chatText.append(username + " has joined the chat.\n"); chatText.setCaretPosition(chatText.getDocument().getLength()); ReceiveThread t2 = new ReceiveThread(1237, chatText, known_users); ConnectionListenerThread t3 = new ConnectionListenerThread(known_users, chatText); t2.start(); t3.start(); } 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(); } } }