Broadcast.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. package rsx.udp;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetAddress;
  6. import java.net.SocketException;
  7. import java.net.SocketTimeoutException;
  8. import java.net.UnknownHostException;
  9. import java.util.ArrayList;
  10. /**
  11. * Broadcast pour trouver un serveur
  12. *
  13. * @author Arthur Brandao
  14. */
  15. public class Broadcast {
  16. /**
  17. * Port pour la socket UDP
  18. */
  19. protected int port;
  20. /**
  21. * Le message à envoyer
  22. */
  23. protected String msg;
  24. /**
  25. * TImeout
  26. */
  27. protected int timeout = 5000;
  28. /**
  29. * Taille du buffer pour l'envoi
  30. */
  31. protected int bufferSize = 1024;
  32. /**
  33. * Liste des serveurs ayant répondu
  34. */
  35. protected ArrayList<InetAddress> servers = new ArrayList<>();
  36. /* --- Constructeurs --- */
  37. /**
  38. * Creation d'un Broadcast
  39. * @param port Le port à utiliser
  40. */
  41. public Broadcast(int port) {
  42. this.port = port;
  43. this.msg = "looking for bomberstudent servers";
  44. }
  45. /**
  46. * Creation d'un Broadcast
  47. * @param port Le port à utiliser
  48. * @param msg Le message à envoyer
  49. */
  50. public Broadcast(int port, String msg) {
  51. this.port = port;
  52. this.msg = msg;
  53. }
  54. /* --- Methodes --- */
  55. /**
  56. * Cherche les serveurs
  57. * @param answer La reponse attendu du serveur
  58. * @return Reussite
  59. */
  60. public boolean search(String answer) {
  61. //Creation socket
  62. DatagramSocket socket = null;
  63. try {
  64. socket = new DatagramSocket();
  65. socket.setBroadcast(true);
  66. socket.setSoTimeout(this.timeout);
  67. } catch (SocketException ex) {
  68. System.err.println("Erreur creation de la socket : " + ex.getMessage());
  69. return false;
  70. }
  71. //Envoi message
  72. byte[] buffer = this.msg.getBytes();
  73. DatagramPacket packet;
  74. try {
  75. packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("255.255.255.255"), this.port);
  76. socket.send(packet);
  77. } catch (UnknownHostException ex) {
  78. System.err.println("Erreur hote inconnu : " + ex.getMessage());
  79. return false;
  80. } catch (IOException ex) {
  81. System.err.println("Erreur IO : " + ex.getMessage());
  82. return false;
  83. }
  84. //Attente reponse
  85. try {
  86. while (true) {
  87. //Recepetion reponse
  88. byte[] tampon = new byte[this.bufferSize];
  89. DatagramPacket dp = new DatagramPacket(tampon, tampon.length);
  90. socket.receive(dp);
  91. String reponse = new String(dp.getData(), 0, dp.getLength());
  92. //Analyse reponse
  93. if(reponse.equals(answer)){
  94. this.servers.add(dp.getAddress());
  95. }
  96. }
  97. } catch (SocketTimeoutException ex) {
  98. //Rien on fini la methode
  99. } catch (IOException ex) {
  100. System.err.println("Erreur IO : " + ex.getMessage());
  101. return false;
  102. }
  103. //Fin
  104. socket.close();
  105. return true;
  106. }
  107. /**
  108. * Vide la liste des serveurs
  109. */
  110. public void clean(){
  111. this.servers = new ArrayList<>();
  112. }
  113. /* --- Getter/Setter --- */
  114. public int getPort() {
  115. return port;
  116. }
  117. public void setPort(int port) {
  118. this.port = port;
  119. }
  120. public String getMsg() {
  121. return msg;
  122. }
  123. public void setMsg(String msg) {
  124. this.msg = msg;
  125. }
  126. public int getTimeout() {
  127. return timeout;
  128. }
  129. public void setTimeout(int timeout) {
  130. this.timeout = timeout;
  131. }
  132. public int getBufferSize() {
  133. return bufferSize;
  134. }
  135. public void setBufferSize(int bufferSize) {
  136. this.bufferSize = bufferSize;
  137. }
  138. public ArrayList<InetAddress> getServers(){
  139. return new ArrayList<>(this.servers);
  140. }
  141. }