import java.net.*; import java.io.*; import java.util.*; class ClientInfo { String partner, ipaddress; int port; public ClientInfo (String partner, String ip, int port) { this.partner = partner; this.ipaddress = ip; this.port = port; } } class Checker extends Thread { Doit server; boolean new_buddies = true, new_buddies_temp = true; public Checker (Doit server) { this.server = server; } boolean isAlive (String ipaddress, int port) { try { Socket socket = new Socket(ipaddress, port); (socket.getOutputStream()).write((new Byte((byte)10)).byteValue()); if (new_buddies) { (socket.getOutputStream()).write((new Byte((byte)85)).byteValue()); (socket.getOutputStream()).write((new Byte((byte)10)).byteValue()); } else (socket.getOutputStream()).write((new Byte((byte)10)).byteValue()); socket.close(); return true; } catch(Exception ex) { } return false; } public void run () { while (true) { try { sleep (1000); } catch (Exception e) {} new_buddies = new_buddies_temp; new_buddies_temp = false; Enumeration elements = server.hash.elements(); while (elements.hasMoreElements()) { ClientInfo ci = (ClientInfo)elements.nextElement(); String prt = String.valueOf(ci.port); if (!isAlive(ci.ipaddress, ci.port)) { server.hash.remove(ci.partner); System.out.println("Server:"+ci.partner+" removed"); new_buddies_temp = true; } } new_buddies = false; } } } class Register extends Thread { Doit server; public Register (Doit server) { this.server = server; } public void run () { String msg; try { ServerSocket socket = new ServerSocket(8081); while (true) { Socket cli = socket.accept(); String ip = cli.getInetAddress().toString(); System.out.println("Receiving from: "+ip); BufferedReader in = new BufferedReader(new InputStreamReader(cli.getInputStream())); DataOutputStream out = new DataOutputStream(cli.getOutputStream()); try { msg = in.readLine(); System.out.println("Register: from:"+ip+" msg:"+msg); if (msg != null) { StringTokenizer t = new StringTokenizer(msg," "); String partner = t.nextToken(); int port = Integer.parseInt(t.nextToken()); String pip = ip.substring(ip.indexOf('/')+1); System.out.println(msg+" registered on machine "+pip); out.writeBytes(msg+" registered on machine "+pip+"\n"); ClientInfo ci = new ClientInfo(partner, pip, port); server.hash.put(partner, ci); server.checker.new_buddies_temp = true; } } catch (Exception e1) { System.out.println("Connection closed ("+e1.toString()+")\n"); } out.close(); in.close(); cli.close(); } } catch (Exception e) { } } } class Message extends Thread { Doit server; public Message (Doit server) { this.server = server; } public void run () { String msg, header; try { ServerSocket socket = new ServerSocket(8080); while (true) { Socket cli = socket.accept(); String ip = cli.getInetAddress().toString(); System.out.println("Receiving from: "+ip); BufferedReader in = new BufferedReader(new InputStreamReader(cli.getInputStream())); DataOutputStream out = new DataOutputStream(cli.getOutputStream()); try { header = in.readLine(); System.out.println("Message: from:"+ip+" header:"+header); StringTokenizer t = new StringTokenizer(header," "); String orig = t.nextToken(); String dest = t.nextToken(); ClientInfo ci = (ClientInfo)server.hash.get(dest); String srvip = ci.ipaddress; if (srvip != null) { System.out.println("Sending to: "+srvip); Socket srv = new Socket(srvip, ci.port); BufferedReader srvin = new BufferedReader( new InputStreamReader(srv.getInputStream())); DataOutputStream srvout = new DataOutputStream(srv.getOutputStream()); if (header != null) { srvout.writeBytes(orig+"\n"); String text; srvout.writeBytes(text=in.readLine()+"\n"); System.out.println("Message: from:"+ip+" msg:"+text); } srvin.close(); srvout.close(); out.writeBytes("ok\n"); } else { System.out.println("User "+dest+" not found by "+orig); out.writeBytes("bad\n"); } out.close(); } catch (Exception e1) { System.out.println("Connection closed"); } in.close(); cli.close(); } } catch (Exception e) { } } } class ShowAll extends Thread { Doit server; public ShowAll (Doit server) { this.server = server; } public void run () { String msg; try { ServerSocket socket = new ServerSocket(8082); while (true) { Socket cli = socket.accept(); String ip = cli.getInetAddress().toString(); System.out.println("ShowAll: receiving null from: "+ip); BufferedReader in = new BufferedReader(new InputStreamReader(cli.getInputStream())); DataOutputStream out = new DataOutputStream(cli.getOutputStream()); try { String outstr = ""; Enumeration elements = server.hash.elements(); while (elements.hasMoreElements()) { ClientInfo ci = (ClientInfo)elements.nextElement(); String prt = String.valueOf(ci.port); outstr += ci.partner+" "+ci.ipaddress+" "+prt+"|"; } out.writeBytes(outstr+"\n"); } catch (Exception e1) { System.out.println("Connection closed"); } } } catch (Exception e) { } } } class RemoveFromDB extends Thread { Doit server; public RemoveFromDB (Doit server) { this.server = server; } public void run () { String msg; try { ServerSocket socket = new ServerSocket(8083); while (true) { Socket cli = socket.accept(); String ip = cli.getInetAddress().toString(); System.out.println("RemoveFromDB: connection: "+ip); BufferedReader in = new BufferedReader(new InputStreamReader(cli.getInputStream())); DataOutputStream out = new DataOutputStream(cli.getOutputStream()); String toremove = in.readLine(); System.out.println("RemoveFromDB: from:"+ip+" msg:"+toremove); try { ClientInfo object; if ((object = (ClientInfo)server.hash.get(toremove)) != null) { String ipaddress = ip.substring(ip.indexOf('/')+1); if (object.ipaddress.equals(ipaddress)) { server.hash.remove((Object)toremove); out.writeBytes("Client "+toremove+" removed from DB\n"); server.checker.new_buddies_temp = true; } else { out.writeBytes("Client name does not match machine ip\n"); } } else { out.writeBytes("Client not in the data base\n"); } } catch (Exception e1) { System.out.println("Connection closed"); } in.close(); out.close(); cli.close(); } } catch (Exception e) { } } } class Doit { Checker checker; Hashtable hash; Doit () { hash = new Hashtable(); Register register = new Register(this); Message message = new Message(this); ShowAll showall = new ShowAll(this); RemoveFromDB remover = new RemoveFromDB(this); checker = new Checker(this); register.start(); message.start(); showall.start(); remover.start(); checker.start(); } } public class Server { public static void main (String arg[]) { new Doit(); } }