public void run() {
        logger.fine("X-Plane receiver listening on port " + datagram_socket.getLocalPort());
        DatagramPacket packet = null;
        while (this.keep_running) {
            try {
                // wait for packet or time-out
                packet = receiveXPlanePacket();

                if  (this.has_reception == false) {
                    this.has_reception = true;
                    logger.info("UDP reception re-established");
                }

                for (int i=0; i<this.reception_observers.size(); i++) {
                    ((XPlaneDataPacketObserver)this.reception_observers.get(i)).new_sim_data(packet.getData());
                }
            } catch (SocketTimeoutException ste) {
                if (this.has_reception == true) {
                    logger.warning("No UDP reception");
                    this.has_reception = false;
                }
            } catch(IOException ioe) {
                logger.warning("Caught I/O error while waiting for UDP packets! (" + ioe.toString() + ")");
            } catch(Exception e) {
                logger.warning("Caught error while waiting for UDP packets! (" + e.toString() + " / " + e.getMessage() + ")");
            }
        }
        logger.fine("X-Plane receiver stopped");
    }