001package csheets.ext.share.core;
002
003import java.io.IOException;
004import java.net.*;
005import java.util.*;
006import java.util.logging.*;
007
008/**
009 * The client discover class that will find servers through network
010 * 
011 * @author Andre
012 * 
013 */
014public class ClientDiscover extends Observable implements Runnable {
015        /** list of connections */
016        List<Connections> connections;
017        /** instance of client discover */
018        private static ClientDiscover instance;
019        /** the observer class */
020        private Observer observer;
021
022        /**
023         * Creates a new client discover
024         */
025        private ClientDiscover() {
026                connections = new ArrayList<Connections>();
027        }
028
029        /**
030         * The instance of running client discover
031         * 
032         * @return the instance of the class
033         */
034        public static ClientDiscover getInstance() {
035                if (instance == null) {
036                        instance = new ClientDiscover();
037                }
038                return instance;
039        }
040
041        /**
042         * Find servers through network
043         * 
044         * @param observer
045         * 
046         * @return a list with servers with sharing open
047         */
048        public List<Connections> findServers(Observer observer) {
049                connections.clear();
050                this.observer = observer;
051                addObserver(observer);
052                try {
053                        Thread thr = new Thread(getInstance());
054                        thr.start();
055                        // wait 3 seconds
056                        Thread.sleep(3000);
057                } catch (InterruptedException e) {
058                        Logger.getLogger(ClientDiscover.class.getName()).log(Level.SEVERE,
059                                        null, e);
060                        setChanged();
061                        notifyObservers();
062                        clearChanged();
063                }
064                return connections;
065        }
066
067        /**
068         * Search a servers through network
069         * 
070         * @throws IOException
071         */
072        private void search() throws IOException {
073                MulticastSocket clientSocket;
074                clientSocket = new MulticastSocket();
075                clientSocket.setBroadcast(true);
076                InetAddress IPAddress = InetAddress.getByName("255.255.255.255");
077                connections = new ArrayList<Connections>();
078                byte[] sendData = new byte[1024];
079                byte[] receiveData = new byte[1024];
080                int i = 5000;
081                String sentence = "18-send me connection";
082                sendData = sentence.getBytes();
083                DatagramPacket sendPacket = new DatagramPacket(sendData,
084                                sentence.length(), IPAddress, 9876);
085                clientSocket.send(sendPacket);
086                clientSocket.setSoTimeout(3000);
087                while (i > 0) {
088                        DatagramPacket receivePacket = new DatagramPacket(receiveData,
089                                        receiveData.length);
090                        clientSocket.receive(receivePacket);
091                        String modifiedSentence = new String(receivePacket.getData());
092                        modifiedSentence = Validate.removeMessage(modifiedSentence);
093                        int port = Integer.parseInt(modifiedSentence);
094                        Connections con = new Connections(port, receivePacket.getAddress());
095                        if (!connections.contains(con)) {
096                                connections.add(con);
097                        }
098                        i--;
099                }
100                clientSocket.close();
101        }
102
103        @Override
104        public void run() {
105                addObserver(observer);
106                try {
107                        search();
108                } catch (SocketTimeoutException e) {
109
110                }
111
112                catch (IOException e) {
113                        Logger.getLogger(ClientDiscover.class.getName()).log(Level.SEVERE,
114                                        null, e);
115                        setChanged();
116                        notifyObservers();
117                        clearChanged();
118                }
119        }
120}