No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

UDPInput.java 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package app.insa.clav.reseau;
  2. import app.insa.clav.Messages.Message;
  3. import java.beans.PropertyChangeListener;
  4. import java.beans.PropertyChangeSupport;
  5. import java.io.ByteArrayInputStream;
  6. import java.io.IOException;
  7. import java.io.ObjectInputStream;
  8. import java.net.*;
  9. import java.util.ArrayList;
  10. /**
  11. * Classe qui permet d'écouter des messages en UDP. Fonctionne dans un thread à part
  12. */
  13. public class UDPInput extends Thread{
  14. /**
  15. * Socket par lequel on va recevoir les paquets
  16. */
  17. private DatagramSocket socket;
  18. /**
  19. * Buffer dans lequel on met les messages reçus si ils passent le filter
  20. */
  21. private ArrayList<Message> msgReceivedBuffer;
  22. /**
  23. * Permet d'implémenter le DP Observateur. Cette classe est l'obeservable.
  24. * Cet attribut permet de notifier les observateurs (ici le modèle, soit l'Application)
  25. */
  26. private PropertyChangeSupport support;
  27. /**
  28. * Filtre qui permet de filtrer les messages entrants. L'index est en correspondance avec le type de message.
  29. * i.e. filter[1] pour message de type 1. Si filter à vrai, message va dans le buffer et on notifie l'application
  30. */
  31. private boolean[] filter;
  32. //Créer un attribut filtre que l'application pourra modifier. Selon le filtre, des notifications seront envoyées à l'application ou non
  33. /**
  34. * Constructeur
  35. * @param localAddress
  36. * Adresse IP locale
  37. * @param localPort
  38. * Numéro de port de la machine locale sur lequel on écoute (le même sur toutes les machines en théorie)
  39. */
  40. public UDPInput(InetAddress localAddress, int localPort){
  41. try {
  42. this.socket = new DatagramSocket(localPort,localAddress);
  43. this.filter = new boolean[5];
  44. this.filter[1] = true;
  45. this.filter[2] = false;
  46. this.filter[3] = false;
  47. this.filter[4] = true;
  48. this.socket.setBroadcast(true);
  49. this.msgReceivedBuffer = new ArrayList<Message>();
  50. this.support = new PropertyChangeSupport(this);
  51. }
  52. catch (SocketException e){
  53. System.out.println("Exception creation SocketDatagrammeConfiguration");
  54. e.printStackTrace();
  55. }
  56. }
  57. /**
  58. * Ajoute un observateur à qui on va envoyer les notifications de réception de messages
  59. * @param pcl
  60. * Représente un classe qui implémente, PropertyChangeListener, donc un observateur
  61. */
  62. public void addPropertyChangeListener(PropertyChangeListener pcl){
  63. //On va mettre name à "App" pour l'application
  64. this.support.addPropertyChangeListener("UDPInput",pcl);
  65. }
  66. /**
  67. * Renvoi le message le plus ancien du buffer et le supprime du buffer
  68. * @return Le message le plus ancien du buffer
  69. */
  70. public Message getMessageReceived(){
  71. return this.msgReceivedBuffer.remove(0);
  72. }
  73. /**
  74. * Change les valeurs du filtre
  75. * @param index
  76. * Numéro du type de message à filtrer
  77. * @param value
  78. * Vrai ou faux selon si on veut laisser passer le message ou non (vrai -> message passe)
  79. */
  80. public void setFilterValue(int index, boolean value){
  81. this.filter[index] = value;
  82. }
  83. /**
  84. * Ecoute en permanance le socket UDP et si un message reçu passe le filtre, on notifie les observateurs
  85. */
  86. @Override
  87. public void run() {
  88. byte[] buffer = new byte[9000];
  89. while(true){
  90. DatagramPacket inputPacket = new DatagramPacket(buffer,buffer.length);
  91. try
  92. {
  93. this.socket.receive(inputPacket);
  94. }
  95. catch (IOException e){
  96. System.out.println("IOException reception paquet UDP");
  97. e.printStackTrace();
  98. }
  99. ByteArrayInputStream byteInStream = new ByteArrayInputStream(inputPacket.getData());
  100. try {
  101. ObjectInputStream objectInStream = new ObjectInputStream(byteInStream);
  102. Message msg = (Message) objectInStream.readObject();
  103. if (this.filter[msg.typeMessage]){
  104. this.msgReceivedBuffer.add(msg);
  105. this.support.firePropertyChange("UDPInput",this.msgReceivedBuffer.size() -1, this.msgReceivedBuffer.size());
  106. }
  107. }
  108. catch (IOException e){
  109. System.out.println("IOException déserialization paquet UDP");
  110. e.printStackTrace();
  111. }
  112. catch (ClassNotFoundException e){
  113. System.out.println("IOException déserialization paquet UDP");
  114. e.printStackTrace();
  115. }
  116. }
  117. }
  118. }