# Socketbesipiel will nicht



## Spin (9. Dez 2009)

Hey Leute ich arbeite mich ein wenig in Netzwerkprogrammierung ein und mein Beispiel will nicht.

Man soll nur die Domain eingeben und das wars.

Ich benutze den Port 13 für Daytime, diese Funktion ist in jeden UNIX Rechner enthalten.


```
public class Socketverbindung {

    public static void main(String []args){

        /* Verbindung zu dem eingegebenen Host mit der Portnummer 13
         * Nachdem der Socket steht, die empfangenden Daten holen*/
        Scanner scanner = new Scanner(System.in);
        String eingabe = scanner.next();

        if (eingabe.isEmpty()) {
            System.err.println("<host>");
            System.exit(1);
        }
        try {
            /* Port 13 : Daytime Service auf UNIX Servern */
            Socket sock = new Socket(eingabe, 13); // Hostname oder InetAdress
            InputStream in = sock.getInputStream(); // Datenempfang ( OutputStream - Versenden )
            int len;
            byte[] b = new byte[100];
            while ((len = in.read(b)) != -1) {
                System.out.write(b, 0, len);
            }
            in.close();
            sock.close();
        } catch (IOException e) {
            System.err.println(e.toString()); // Ausgabe des Fehlers.
            System.exit(1);
        }
    }
}
```


Ganz einfach. Aber "Connection timed out: connect"

Danke für Tipp.


----------



## mfernau (9. Dez 2009)

Also bei mir läuft kein Dienst auf Port 13 ohne das ich etwas dafür tue.. Es muss also auch einen Dienst bei Dir geben, der auf diesem Port überhaupt lauscht und etwas antwortet


----------



## mfernau (9. Dez 2009)

testen ob so ein Dienst auf deinem Rechner läuft kannst du auch mit telnet:
telnet localhost 13

oder statt localhost ein anderer hostname


----------



## Spin (9. Dez 2009)

Ok danke. Ich merke schon dass auf diesen Port nichts läuft.
Kein Response :/

Naja habe Probeweise den Port 21 genommen und bekomme ne Antwort.
Port 21 -> FTP.

Danke:toll:


----------



## SlaterB (9. Dez 2009)

zur Ergänzung noch mit eigenem Server:

```
public class Test
{
    public static void main(String[] args)
        throws Exception
    {
        final int port = 5995;
        String eingabe = "localhost";

        Runnable r = new Runnable()
            {
                public void run()
                {
                    try
                    {
                        ServerSocket server = new ServerSocket(port);
                        System.out.println("Server läuft");
                        while (true)
                        {
                            Socket x = server.accept();
                            x.getOutputStream().write(new byte[]
                                {41, 42, 43, 44, 45, 46, 47, 48});
                            Thread.sleep(500);
                            x.close();
                        }
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            };
        new Thread(r).start();

        Thread.sleep(2000);
        System.out.println("gleich gehts los");
        Socket sock = new Socket(eingabe, port);
        System.out.println("bin drin");
        InputStream in = sock.getInputStream();
        int len;
        byte[] b = new byte[100];
        while ((len = in.read(b)) != -1)
        {
            System.out.write(b, 0, len);
        }
        in.close();
        sock.close();
        System.out.println("\nEnde");
        System.exit(0);
    }

}
```


----------



## Spin (9. Dez 2009)

Ich habe es hier auch gemacht , aber da bekomme ich auch nur einen Fehler.
In meinen Buch steht dass es für Linux programmiert wurde, aber ich bin Win-user. 

Kann mir einer sagen welchen Port ich nehmen kann , um einfache schreib und lese sachen auszuprobieren?

Ich kenne eine reihe an Ports, wie 80 und 21, usw. , aber mich würde mal interessieren über welchen man schreiben kann. 

 * Ports:
 * Kommunikation zwischen zwei Rechnern läuft auf der Basis: Client-Server.
 * Bsp.: Seitenabruf im Browser.
 * Auf einem Host laufen meist unterschiedliche Server-Anwendungen, die noch dazu von
 * mehreren Clients gleichzeitig benutzt werden können. Um die Server voneinander zu unterscheiden
 * zu können: -> Portnummer. (Oberhalb des Transportprotokolls.)



```
public static void main(String []args){


        /* Verbindung zu dem eingegebenen Host mit der Portnummer 13
         * Nachdem der Socket steht, die empfangenden Daten holen*/
        Scanner scanner = new Scanner(System.in);
        String eingabe = scanner.next();

        if (eingabe.isEmpty()) {
            System.err.println("<host>");
            System.exit(1);
        }
        try {
            /* Port 13 : Daytime Service auf UNIX Servern */
            Socket sock = new Socket(eingabe, 21); // Hostname oder InetAdress
            InputStream in = sock.getInputStream(); // Datenempfang
            OutputStream out = sock.getOutputStream(); // Daten versenden
            // Timeout setzen
            sock.setSoTimeout(300); // in ms
            // AusgabeThread erzeugen
            OutputThread th = new OutputThread(in);
            th.start();
            // Schleife für Benutzereingaben
            BufferedReader conin = new BufferedReader(new InputStreamReader(System.in));
            String line="";
            while(true){
                // Eingabezeilen lesen
                line = conin.readLine();
                if(line.equalsIgnoreCase("QUIT")){
                    break;
                }
                // Eingabezeilen an ECHO server schicken
                out.write(line.getBytes());
                out.write('\r');
                out.write('\n');
                // Ausgabe abwarten
                th.yield();
            }
            //Programm beenden
            System.out.println("terminating output stream..");
            th.requestStop();
            th.yield();

            try{
                Thread.sleep(1000);
            }
            catch (InterruptedException e ){

            }
            in.close();
            sock.close();
        } catch (IOException e) {
            System.err.println(e.toString()); // Ausgabe des Fehlers.
            System.exit(1);
        }

     }

}
class OutputThread extends Thread {

    InputStream in;
    boolean stoprequesetd;

    public OutputThread(InputStream in) {
        super();
        this.in=in;
        stoprequesetd = false;

    }
    public synchronized void requestStop(){
        stoprequesetd = true;
    }

    @Override
    public void run(){
        int len;
        byte[] b = new byte[100];
        try{
            while(!stoprequesetd) {
                try{
                    if((len = in.read(b)) != -1){
                        break;
                    }
                     System.out.write(b, 0, len);
                } catch ( InterruptedIOException e){
                    // nochmal versuchen
                }
            }
        }catch (IOException e) {
            System.err.println(e.toString()); // Ausgabe des Fehlers.
            System.exit(1);
        }
    }
}
```


Danke . PS: Ich nutze das Handbuch zu Javaprogrammierung


----------



## tuxedo (9. Dez 2009)

Ab 1024 aufwärts bis hin zu 65535 kannst du bedenkenlos testen. Ich wähle in der Regel Ports im 5 stelligen Bereich. 

Wenn du eine "BindException" o.ä., bekommst ist der Port schon von was anderem belegt.

Für Ports <=1024 brauchst du root/admin rechte ...

- Alex


----------



## SlaterB (9. Dez 2009)

> Kann mir einer sagen welchen Port ich nehmen kann , um einfache schreib und lese sachen auszuprobieren?

wie gesagt, programmier dir doch einen eigenen Server in Java, in deinem Buch müßte es dazu auch Beispiele geben,
sonst bei google Stichwort EchoServer Java


----------



## Spin (9. Dez 2009)

Hey Slater , das ist erst im nächsten Abschnitt

Aber danke dir 
Danke euch beiden.


Aber das Problem ist immer noch mit den Ports. Ich habe einen größer als 1024 genommen und mein Apache läuft auch. 

Die Anweisung telnet localhost 7  für einen ECHO
geht wohl nur unter linux .....

Naja mir ist anfangs nur wichtig dass ich den code verstehe , und das läuft


----------

