
import java.util.Observable;
import java.net.Socket;
import java.io.*;
/**
 * Die Klasse für die Kommunikation. Die Klasse sendet
 * und empfängt Texte.
 * @author  Mark Donnermeyer
 */
public class SocketHandler extends Observable implements Runnable {
    
    Socket socket;
    OutputStream os;
    boolean stop = false;
    
    public SocketHandler(Socket socket) throws IOException {
        this.socket = socket;
        this.os = socket.getOutputStream();
    }
    
    /**
     * Der Klasse horcht am Kommunikationskanal auf ankommende
     * Nachrichten und informiert interessierte Objekte, wenn
     * ein neuer Text vorliegt.
     */
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            
            String text;
            while(!stop && (text = reader.readLine()) != null) {
                System.out.println("-> " + text);
                // Alle Observer benachrichtigen
                setChanged();
                notifyObservers(text);
            }
        }
        catch (Exception e) {}
        close();
    }
    
    /**
     * Einen Text an den Kommunikationspartner verschicken
     */
    public void write(String text) throws IOException {
        System.out.println("<- " + text);
        os.write((text + "\n").getBytes());
    }
    
    /*
     * Den Thread stoppen
     */
    public void stopNow() {
        stop = true;
    }
    
    /**
     * Den Kommunikationskanal abbauen
     */
    public void close() {
        try {
            os.close();
            socket.close();
        }
        catch(Exception ignore) {}
    }
}
