Mein erstes Mal…mit Java

Mein erstes Mal…mit Java

Hello World ist DER Standard bei programmierungen. So ließ auch ich mich darauf ein. Es handelt sich um eine Anleitung der auch ich gefolgt bin, es handelt sich nicht um einen Code. Ziel ist es gewesen eine Java Anwendung als Dienst anzulegen. Hierzu benötigt es erstmal eine Anwendung. Also „programmieren“ wir uns eine.

Erstmal beginne ich mit der Grundaufstellung von einer Java-Anwendung – der Verzeichnisstruktur. Diese sieht wie folgt aus:

Learning_Java\
  lib\
    classes\
  src\
    java\

In dem Ordner „..\Learning_Java\src\java\“ legen wir nun eine neue Datei an die wir HelloWorldTest.java nennen. Wir öffnen diese in unserem Lieblingseditor (bei mir Notepad++) und tragen folgenden Code ein:

Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class HelloWorldServer
    implements Runnable
{
    private final Socket m_socket;
    private final int m_num;

    HelloWorldServer( Socket socket, int num )
    {
        m_socket = socket;
        m_num = num;
        
        Thread handler = new Thread( this, "handler-" + m_num );
        handler.start();
    }
    
    public void run()
    {
        try
        {
            try
            {
                System.out.println( m_num + " Connected." );
                BufferedReader in = new BufferedReader( new InputStreamReader( m_socket.getInputStream() ) );
                OutputStreamWriter out = new OutputStreamWriter( m_socket.getOutputStream() );
                out.write( "Welcome connection #" + m_num + "\n\r" );
                out.flush();
                
                while ( true )
                {
                    String line = in.readLine();
                    if ( line == null )
                    {
                        System.out.println( m_num + " Closed." );
                        return;
                    }
                    else
                    {
                        System.out.println( m_num + " Read: " + line );
                        if ( line.equals( "exit" ) )
                        {
                            System.out.println( m_num + " Closing Connection." );
                            return;
                        }
                        //else if ( line.equals( "crash" ) )
                        //{
                        //    System.out.println( m_num + " Simulating a crash of the Server..." );
                        //    Runtime.getRuntime().halt(0);
                        //}
                        else
                        {
                            System.out.println( m_num + " Write: echo " + line );
                            out.write( "echo " + line + "\n\r" );
                            out.flush();
                        }
                    }
                }
            }
            finally
            {
                m_socket.close();
            }
        }
        catch ( IOException e )
        {
            System.out.println( m_num + " Error: " + e.toString() );
        }
    }
    
    public static void main( String[] args )
        throws Exception
    {
        int port = 9000;
        if ( args.length > 0 )
        {
            port = Integer.parseInt( args[0] );
        }
        System.out.println( "Accepting connections on port: " + port );
        int nextNum = 1;
        ServerSocket serverSocket = new ServerSocket( port );
        while ( true )
        {
            Socket socket = serverSocket.accept();
            HelloWorldServer hw = new HelloWorldServer( socket, nextNum++ );
        }
    }
}

Die Anwendung lauscht nach dem starten auf Port 9000 auf eine eingehende Verbindung und wertet jede Kommunikation aus die darüber läuft.

Jede neue Verbindung wird in einem neuen Handler-Thread aufgemacht (was das ist ist nochmal ein Thema für sich, habe ich selbst auch nur grob verstanden, danke hier an den geduldigen Kollegen) und dort abgefrühstückt bis diese Verbindung durch den Befehl „exit“ geschlossen wird.

Danach muss diese Java Applikation noch einmal durch den Compiler gejagt werden. Dies tut man mit indem man den compiler mit „javac“ aufruft und ihm den Pfad zur Applikation weist. Dies mache ich in diesem Beispiel aus dem „Learn_Java“ Verzeichnis raus.

BAT
WoAuchImmerDerOrdnerLiegt\Learn_Java> javac -d lib\classes src\java\HelloWorldServer.java

Danach sollte sich eine Class Datei im „..\lib\classes“ befinden. Dann lief alles rund und wir können die Applikation einmal ausführen und auf Funktion überprüfen.

Hierzu rufen wir mit

BAT
WoAuchImmerDerOrdnerLiegt\Learn_Java> java -classpath lib\classes HelloWorldServer

die Applikation aus und erhalten als Rückmeldung:

BAT
Accepting connections on port: 9000

Auf dem Server starten wir nun eine weitere Eingabeaufforderung und bauen eine Telnet-Verbindung auf. Vorrausgesetzt das Feature ist installiert.

BAT
WoAuchImmerDerOrdnerLiegt\Learn_Java> telnet localhost 9000

Wenn die Verbindung aufgebaut wurde erhält man als Rückmeldung die Sitzungsnummer die man hat.
Jede Eingabe die wir nun tätigen wird uns als echo zurückgegeben bis wir „exit“ eingeben.

Wenn man nun in der Applikation die auskommentierten Zeilen wieder einfügt hat man die Möglichkeit nach dem erneuten Compilieren den Befehl Crash zu nutzen der mit Runtime.getRuntime().halt(0) den Server simuliert zum Absturz bringt.

Jetzt hat man eine Applikation die man zu einem Windows Dienst „umwandeln“ kann.