001package csheets.ext.share.core;
002
003import java.io.IOException;
004import java.net.*;
005import java.util.*;
006import java.util.logging.*;
007
008/**
009 * Class that implements a server side of the discover through network
010 * 
011 * @author Andre
012 * 
013 */
014public class ServerDiscover extends Observable implements Runnable {
015        /** Instance of server discover */
016        private static ServerDiscover instance = null;
017        /** Port of the connection */
018        private int port;
019        /** the observer class */
020        private Observer observer;
021
022        /**
023         * Creates a new client discover
024         */
025        private ServerDiscover() {
026        }
027
028        /**
029         * The instance of running server discover
030         * 
031         * @return the instance of the class
032         */
033        public static ServerDiscover getInstance() {
034                if (instance == null) {
035                        instance = new ServerDiscover();
036                }
037                return instance;
038        }
039
040        /**
041         * Broadcasts a message throw network
042         * 
043         * @param port
044         *            the port of the connection
045         * @param observer
046         *            the observer class
047         */
048        public void findClients(int port, Observer observer) {
049                this.port = port;
050                this.observer = observer;
051                addObserver(observer);
052                Thread thr = new Thread(getInstance());
053                thr.start();
054        }
055
056        /**
057         * Broadcasts a message throw network
058         * 
059         * @exception IOException
060         *                throws if a I/O exception occurs
061         */
062        @SuppressWarnings("resource")
063        private void broadcast() throws IOException {
064                MulticastSocket serverSocket;
065                serverSocket = new MulticastSocket(9876);
066
067                byte[] receiveData = new byte[1024];
068                byte[] sendData = new byte[1024];
069                int i = 1;
070                while (i > 0) {
071                        DatagramPacket receivePacket = new DatagramPacket(receiveData,
072                                        receiveData.length);
073
074                        serverSocket.receive(receivePacket);
075                        String testReceive = new String(receivePacket.getData());
076                        testReceive = Validate.removeMessage(testReceive);
077
078                        if (testReceive.equals("send me connection")) {
079                                InetAddress IPAddress = receivePacket.getAddress();
080                                int portPacket = receivePacket.getPort();
081
082                                int portSend = port;
083
084                                String portConnect = portSend + "";
085                                int portLenght = portConnect.length();
086                                portConnect = portLenght + "-" + portSend;
087
088                                sendData = portConnect.getBytes();
089                                DatagramPacket sendPacket = new DatagramPacket(sendData,
090                                                sendData.length, IPAddress, portPacket);
091                                serverSocket.send(sendPacket);
092                        }
093                }
094                // serverSocket.close();
095
096        }
097
098        @Override
099        public void run() {
100                try {
101                        addObserver(observer);
102                        broadcast();
103                } catch (IOException e) {
104                        Logger.getLogger(ServerDiscover.class.getName()).log(Level.SEVERE,
105                                        null, e);
106                        setChanged();
107                        notifyObservers();
108                        clearChanged();
109                }
110        }
111}