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}