public void run() {
        while (this.keep_running) {
            try {
                this.ois = new ObjectInputStream(new FileInputStream(this.filename));

                try {
                    while (this.keep_running) {
                        byte[] sim_data = (byte[])ois.readObject();
                        for (int i=0;i<this.sim_data_observers.size();i++) {
                            ((XPlaneDataPacketObserver)this.sim_data_observers.get(i)).new_sim_data(sim_data);
                        }
                        Thread.sleep(this.delay_between_packets);
                        //System.out.print(".");
                    }
                } catch (EOFException e) {
                    // reached end of recording. ignore
                }
            } catch (Exception e) {
                System.out.print("could not replay flight session (" + e.toString() + "). will stop now ... ");
                keep_running = false;
            } finally {
                if (this.ois != null) {
                    try {
                        this.ois.close();
                    } catch (Exception e) {
                        System.out.println("could not close flight session file (" + e.toString() + "). will stop now ... ");
                    }
                }
            }
        }
        System.out.println("Flight Session player stopped");
    }