rendered paste body/*import java.net.DatagramPacket;import java.net.DatagramSocket;*/import java.net.*;import java.util.List;import java.util.StringTokenizer;import java.util.Iterator;import java.lang.Integer;import java.io.*;//TODO implementar concorrencia//TODO averiguar heart-beat ou keepAlivepublic class Server { int port; InetAddress group; String room; List<InetAddress> clients; Server(int port, InetAddress group, String room){ this.port = port; this.group = group; this.room = room; } int Port(){ return this.port; } InetAddress Group(){ return this.group; } String Room(){ return this.room; } List<InetAddress> Clients(){ return this.clients; } void addClient(InetAddress address){ this.clients.add(address); } public static void main(String[] args) throws Exception { if( args.length != 3 ) { System.err.println("usage: java Server port multicast_group room") ; System.exit(0) ; } int port = Integer.parseInt( args[0]) ; InetAddress group = InetAddress.getByName( args[1] ) ; String room = args[2]; if( !group.isMulticastAddress() ) { System.err.println("Multicast address required...") ; System.exit(0) ; } Server myServer = new Server(port, group, room); MulticastSocket ms = new MulticastSocket(port); ms.joinGroup(group); for(;;) { //ciclo infinito de atendimento... //recebemos os pedidos DatagramPacket p = new DatagramPacket(new byte[65536], 65336); ms.receive(p); //obter o conteudo da mensagem recebida... byte[] echoRequestData = p.getData(); int echoRequestLength = p.getLength(); String request = new String(p.getData(),0, p.getLength()); StringTokenizer st = new StringTokenizer(request, " "); Integer answerPort; Socket s; OutputStream os; byte[] data; switch((st.nextToken()).toCharArray()[0]){ case 'L': //envio a minha lista ao cliente data = myServer.Room().getBytes(); myDatagramPacket answerPacket = myDatagramPacket(data, data.length); myDatagramSocket() answerSocket = new myDatagramSocket(); answerPacket.setAddress(p.getAddress()); answerPort = Integer.parseInt(st.nextToken()); answerPacket.setPort(answerPort); answerSocket.send(answerPacket); //s = new Socket(p.getAddress(), answerPort.intValue()); //os = s.getOutputStream(); //os.write(data); break; case 'J': //adicionar este cliente a minha sala Iterator<InetAddress> it = myServer.Clients().iterator(); InetAddress address = p.getAddress(); while(it.hasNext()){ if(it.next().equals(address)){ //mandar msg ao cliente a dizer que ja existe answerPort = Integer.parseInt(st.nextToken()); s = new Socket(p.getAddress(), answerPort.intValue()); os = s.getOutputStream(); data = "-1".getBytes(); os.write(data); break; } } myServer.addClient(p.getAddress()); //mandar msg ao cliente a dizer que foi adicionado answerPort = Integer.parseInt(st.nextToken()); s = new Socket(p.getAddress(), answerPort.intValue()); os = s.getOutputStream(); data = "1".getBytes(); os.write(data); //criar thread para atender o nosso cliente break; default: //mandar msg ao cliente com pedido invalido answerPort = Integer.parseInt(st.nextToken()); s = new Socket(p.getAddress(), answerPort.intValue()); os = s.getOutputStream(); data = "-2".getBytes(); os.write(data); break; } } }}