package javacodebook.net.socket.telnetclient;
/**
 * @author Benjamin Rusch
 * 
 * Dieser kleine TelnetClient baut unter Angabe der IP-Addresse und Port-Nummer 
 * eine Verbindung zum jeweiligen host auf. 
 * Über die Konsole könne Strings zum host geschickt werden. Seine Antwort wird 
 * entgegengenommen und auf die Konsole geschrieben. 
 * 
 * Achtung: Damit dieser Client reibungslos funktioniert, muss der host immer 
 * genau eine Zeile zurückschicken. Werden mehr Zeilen zurückgeschickt, werden 
 * alle ausser der ersten ignoriert, wird keine zurückgeschickt, ist der Client 
 * bis auf weiteres geblockt.
 */

import java.io.*;
import java.net.*;

public class TCPClient {

	/**
	 * Variablen der Anwendung
	 */
	public static int port = 0;
	public static String  host = null;
	public static Socket server = null;
	
	public static void main(String [] args) throws Exception {
	 
 		try{
 			
 			// Benutzter-Eingaben werden an einen BuuferedReader 
 			// weitergeleitet.
		  	BufferedReader userIn=new BufferedReader(new InputStreamReader(System.in));
 			
 			
  			// Für den Verbindungsaufbau zum Host werden Benutzereingaben benötigt.
  			System.out.println("Mit welchem Rechner wollen Sie verbunden werden:");
  			host = userIn.readLine();		
  			System.out.println("Auf welchem Port wollen Sie sich anmelden?");
  			port = Integer.parseInt(userIn.readLine());
  			
  			// Ein Socket wird erstellt. Hierbei wird eine Verbindung zum 
  			// host aufgebaut. Das Socket-Objekt repräsentiert den host.
			server = new Socket(InetAddress.getByName(host),port);
			
			System.out.println("Verbindung zu "+host+" auf Port: "+port+" aufgebaut!");
  			
  			// Der InputStream vom Socket wird geholt, und an einen BufferedReader 
  			// weitergeleitet. So können Servermeldungen leicht ausgelesen werden.
		  	BufferedReader serverIn = new BufferedReader( 
		  			new InputStreamReader(server.getInputStream()));
		  	
		  	// Ein Printwriter leitet sämtliche Eingaben, an den 
		  	// Outputstream des Servers weiter, so können, einfach 
		  	// Meldungen an den Server übertragen werden.
		  	PrintWriter serverOut = new PrintWriter(server.getOutputStream(),true);
		
		  	// Benutzer eingabe
		   	String command=null;
		
		   	// Antwort vom host	
		  	String response=null;
		  	
		  	// Schleife läuft solange bis der Server die Verbindung 
		  	// unterbricht. 
		  	do {
		  		// Benutzereingabe wird ausgelesen und zum Server geschickt
		  		
		   		System.out.print("Eingabe: ");
		   		command=userIn.readLine();
		   		serverOut.println(command);
		   		serverOut.flush();
		   		// Antwort vom Server wird entgegen genommen, und auf die 
		   		// Konsole geschrieben
		   		response=serverIn.readLine();
		   		System.out.println(response);
		   	}
		   	while(response!=null);  	
		 }
		 catch(IOException e) {
		 	System.out.println("Verbindung zum Server verloren!");
		 }
		 finally {
		 	try { 
		    	// Socket wird geschlossen
		    	server.close(); 
		  	}
		  	catch(IOException e) {
		  		System.err.println(e);
		 	}
		}
	}
}