# TCP-Server



## pythonjava030 (9. Jul 2018)

ich möchte einen TCP-Server implementieren der ein Programm auf einem anderen Rechner ausführt, das ich zuvor geschrieben hab. Es ist ein kleines Programm das parallel Suchanfragen von namen und nummer ausführen kann. Dieses Programm soll auf dem Browser des anderen Rechners ausgeführt werden. Leider kenn ich mich mit web sockets kaum aus. Könnte mir bitte jemand helfen den code zum laufen zu bringen. ich weiss nicht wie ich den Request richtig aufbauen muss.


```
package Server;
import java.io.*;
import java.net.*;
/**
* Created by ubuntu on 02.07.18.
* Wartet auf pc am Port 9021
*/

class TcpEchoServer {
    public static void main([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL][] args) throws [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+exception']Exception[/URL] {
        int serverPort = 9021;
        [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println("S: Start auf Host pc" +
                " am Port "+serverPort);

        // ServerSocket einrichten und im accept() warten
        // ---------------------------------------------------------
        [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+serversocket']ServerSocket[/URL] ss = new [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+serversocket']ServerSocket[/URL](serverPort);
        [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+socket']Socket[/URL]       s = null;
        [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println("S: Vor dem accept()");
        s = ss.accept();

        // Leser und Schreiber einrichten
        // ---------------------------------------------------------
        [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+bufferedreader']BufferedReader[/URL] sbr = new [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+bufferedreader']BufferedReader[/URL](
                new [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+inputstreamreader']InputStreamReader[/URL](
                        s.getInputStream()));
        [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+printwriter']PrintWriter[/URL] spw = new [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+printwriter']PrintWriter[/URL](s.getOutputStream());

        // Die wiederholten Echos mit diesem Client abwickeln
        // ---------------------------------------------------------
        [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] zeile;//inputline
        while(true) {
            [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println("S: Vor dem readLine()");
            zeile = sbr.readLine();
            [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println("S: Aus dem Socket kommt->" + zeile);
            spw.println(zeile);               // <== Das ist das Echo
            spw.flush();
            if(zeile.equals("quit")) break;
        } // while

        spw.close();//writer
        sbr.close();//reader
        ss.close();//
        s.close();
        //System.out.println("°Schließe Client.");

    }

    private static [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] sendRequest() {

        [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] request = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\n" +
                "<html>" +
                "<body>" +
                "<h2 align=center>Telefonverzeichnis</h2>" +
                "<h3>Sie können nach Name oder nach Telefonnummer oder nach beiden (nebenläufig) suchen.</h3>" +
                "<form method=get action=\"http://sun70:9865[URL='http://sun70:9865\']\[/URL]">" +
                "<table>" +
                "<tr>" + "<td valign=top>[URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+name']Name[/URL]:</td>" + "<td><input name=A>" + "</td>" + "<td>" + "</td>" + "</tr>" +
                "<tr>" + "<td valign=top>Nummer:</td>" + "<td>" + "<input name=B>" + "</td>" + "<td>" + "</td>" + "</tr>" +
                "<tr>" + "<td valign=top><input type=submit name=C value=Suchen></td>" +
                "<td>" + "<input type=reset>" + "</td>" +
                "<td>" + "<input type=submit name=D value=\"Server beenden\" >" + "</td>" + "</tr>" +
                "</table>" +
                "</form>" +
                "</body>" +
                "</html>" +
                "\r\n";

        return request;

    }
}
```


```
import Ausgabe.Drucker;
import Telefonbuch.Suche;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
* Main Klasse
*/
public class Main {
    public static void main([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL][] args) {
        try {
            [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+bufferedreader']BufferedReader[/URL] br = new [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+bufferedreader']BufferedReader[/URL](new [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+inputstreamreader']InputStreamReader[/URL]([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].in));

            // "(^[a-zäüö]+[ ]*[a-zäüö]+)[ ]*?|(\\d+)" = (Gruppe 1 = Name + Leerzeichen aber) (Gruppe 2 = Nummer)
            Pattern pattern = Pattern.compile("(^[a-zäüö]+[ ]*[a-zäüö]+)[ ]*?|(\\d+)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);

            [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] EXIT_CMD = "EXIT".toLowerCase();
            [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] ALL_CMD = "ALLE".toLowerCase();

            [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println("Geben sie bitte einen 'NAMEN' oder 'NUMMER' ein bzw. 'NAME'+'NUMMER' getrennt durch ein Leerzeichen ein. Um den Gesamten Eintrag der Tabelle zu erhalten geben sie bitte '" + ALL_CMD.toUpperCase() + "' ein.");
            [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println("Um das Programm zu Beenden gib <" + EXIT_CMD.toUpperCase() + "> ein.");

            while (true) {
                [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.print(""); // Startzeile des Terminals
                [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] input = br.readLine();

                Matcher matcher = pattern.matcher(input);

                Drucker drucker = new Drucker();
                Suche nameSuche, nummerSuche, allEintraege;

                try {
                    if (input.length() == 0 || input.startsWith(" ")) {    // Leerzeichen und Leere Eingabe ueberpruefung
                        drucker.addErrorMessage("Bitte Eingabe Überprüfen: Es wird kein Leerzeichen als Eingabe Akzeptiert!");

                    } else if (input.length() == EXIT_CMD.length() && input.toLowerCase().equals(EXIT_CMD)) {   // Exit-Befehl ueberpruefung
                        [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println("Auf Wiedersehen!");
                        return; // Beendet das Programm

                    } else if (input.length() == ALL_CMD.length() && input.toLowerCase().equals(ALL_CMD)) {   // Alle Eintraege anzeigen
                        allEintraege = new Suche(); // Alle Eintraege Iteration wird Initialisiert

                        allEintraege.start();  // Alle Eintraege wird gestartet
                        allEintraege.join();   // Thread wartet bis er fertig ist

                        drucker.add(allEintraege.getList());   // Alle Eintraege werden an Drucker uebergeben

                    } else { // Namen und Nummern verarbeitung
                        while (matcher.find()) { // laeuft solange bis alle Gefundenen Patterns bearbeitet wurden
                            //
                            // Startet eine Namen Suche in einem Thread
                            //
                            if (matcher.group(1) != null && matcher.group(2) == null) {   // Enthaelt nur A-Z und Umlaute Check
                                nameSuche = new Suche(matcher.group(1)); // Namen Suche wird Initialisiert

                                nameSuche.setUncaughtExceptionHandler((t, e) -> [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println(">> " + matcher.group(1) + " konnte als Namen nicht gefunden werden. Bitte Prüfen sie die Eingabe."));
                                nameSuche.start(); // Nummern Suche wird gestartet
                                nameSuche.join();  // Thread wartet bis er fertig ist

                                drucker.add(nameSuche.getList());  // Nummern Suche wird an Printer uebergeben

                            }
                            if (matcher.group(2) != null && matcher.group(1) != null) {   // Enthaelt nur Zahlen Check
                                    nummerSuche = new Suche([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+integer']Integer[/URL].parseInt(matcher.group(2)));   // Nummern Suche wird Initialisiert
                                    nameSuche = new Suche(matcher.group(1)); // Namen Suche wird Initialisiert
                                    nameSuche.setUncaughtExceptionHandler((t, e) -> [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println(">> " + matcher.group(1) + " konnte als Namen nicht gefunden werden. Bitte Prüfen sie die Eingabe."));
                                    nummerSuche.setUncaughtExceptionHandler((t, e) -> [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println(">> " + matcher.group(2) + " konnte als Nummer nicht gefunden werden. Bitte Prüfen sie die Eingabe."));

                                    nummerSuche.start();   // Nummern Suche wird gestartet
                                    nameSuche.start(); // Nummern Suche wird gestartet
                                    nummerSuche.join();
                                    nameSuche.join();  // Thread wartet bis er fertig ist

                                drucker.add(nameSuche.getList());  // Nummern Suche wird an Printer uebergeben
                                drucker.add(nummerSuche.getList());   // Nummern Suche wird an Drucker uebergeben



                            }

                            //
                            // Startet eine Nummern Suche in einem Thread
                            //
                            if (matcher.group(2) != null && matcher.group(1) == null ) {   // Enthaelt nur Zahlen Check
                                nummerSuche = new Suche([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+integer']Integer[/URL].parseInt(matcher.group(2)));   // Nummern Suche wird Initialisiert

                                nummerSuche.setUncaughtExceptionHandler((t, e) -> [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println(">> " + matcher.group(2) + " konnte als Nummer nicht gefunden werden. Bitte Prüfen sie die Eingabe."));
                                nummerSuche.start();   // Nummern Suche wird gestartet
                                nummerSuche.join();   // Thread wartet bis er fertig ist

                                drucker.add(nummerSuche.getList());   // Nummern Suche wird an Drucker uebergeben


                            }
                        }

                    }
                } catch ([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+exception']Exception[/URL] e) {
                    e.printStackTrace();
                } finally {
                    drucker.print();   // Drucker - Warteschlange wird ausgegeben
                }
            }
        } catch ([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+exception']Exception[/URL] e) {
            e.printStackTrace();
        }
  }
}
```


```
package Telefonbuch;

import java.util.ArrayList;
import java.util.List;

/**
* Klasse zum finden der Adressen
*/
class Telefonliste {
    private List<Eintrag> telefonliste = new ArrayList<Eintrag>();

    /**
     * Initialisiert die Adressen
     */
    Telefonliste() {
        addContact(new Eintrag("Meier", 4711));
        addContact(new Eintrag("von Ulm", 1815));
        addContact(new Eintrag("Müller", 4711));
        addContact(new Eintrag("Meier", 1816));
    }

    private void addContact(Eintrag a) { this.telefonliste.add(a); }

    /**
     * Suche und Ausgabe
     *
     * Namens Suche
     */
    List<Eintrag> find([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] name) {
        List<Eintrag> list = new ArrayList<>(findName(name));
        return list.size() == 0 ? null : list;
    }

    /**
     * Nummer Suche
     */
    List<Eintrag> find(int nummer) {
        List<Eintrag> list = new ArrayList<>(sucheNummer(nummer));
        return list.size() == 0 ? null : list;
    }

    /**
     *Liste mit Einträgen
     */
    List<Eintrag> getAll() {
        List<Eintrag> result = new ArrayList<>(telefonliste);
        if (result.isEmpty()) {
            throw new [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+nullpointerexception']NullPointerException[/URL]("leer");
        } else {
            return result;
        }

    }

    /**
     * Namens Suche
     * liefert Liste mit Einträgen
     */
    private List<Eintrag> findName([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] name) {
        List<Eintrag> result = new ArrayList<>();
        for (Eintrag value : telefonliste) {
            if (value.getName().toLowerCase().equals(name.toLowerCase())) {
                result.add(value);
            }
        }
        if (result.isEmpty()) {
            throw new [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+nullpointerexception']NullPointerException[/URL](name + " nicht gefunden.");
        } else {
            return result;
        }
    }

    /**
     * Nummer Suche
     * liefert Liste mit Eintrag
     */
    private List<Eintrag> sucheNummer(int nummer) {
        List<Eintrag> result = new ArrayList<>();
        for (Eintrag value : telefonliste) {
            if (value.getNummer() == nummer) {
                result.add(value);
            }
        }
        if (result.isEmpty()) {
            throw new [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+nullpointerexception']NullPointerException[/URL](nummer + " nicht gefunden.");
        } else {
            return result;
        }
    }
}
```
(
	
	
	
	





```
package Telefonbuch;

import java.util.ArrayList;
import java.util.List;

/**
* Such Klasse mit Threads
*/
public class Suche extends [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+thread']Thread[/URL] {
    private Telefonliste telefonliste = new Telefonliste();
    private List<Eintrag> searchList = new ArrayList<>();

    private [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] name;
    private [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+integer']Integer[/URL] nummer;

    public Suche() {
        this.name = null;
        this.nummer = null;
    }

    public Suche([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] name) {
        this.name = name;
    }

    public Suche([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+integer']Integer[/URL] nummer) {
        this.nummer = nummer;
    }

    public void run() {
        if (this.name != null) {
            this.searchList.addAll(this.telefonliste.find(this.name));
        } else if (this.nummer != null) {
            this.searchList.addAll(this.telefonliste.find(this.nummer));
        } else {
            this.searchList.addAll(this.telefonliste.getAll());
        }
    }

    public List<Eintrag> getList() {
        return this.searchList;
    }
}
```
(
	
	
	
	





```
package Telefonbuch;

/**
* Klasse für die Adressbuch Eintraege
*/
public class Eintrag {
    private [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] name;
    private int nummer;

    Eintrag([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] name, int nummer) {
        this.name = name;
        this.nummer = nummer;
    }

    [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] getName() {
        return name;
    }

    int getNummer() {
        return nummer;
    }
    public [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] toString() {
        return [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL].format("%-10s%-10d\n", getName(), getNummer());
    }
}
```
(
	
	
	
	





```
package Ausgabe;

import Telefonbuch.Eintrag;

import java.util.List;

/**
* Ausgabe Klasse
*/
public class Drucker {
    private StringBuilder sb = new StringBuilder();

    /**
     * Formatierung
     */
    public Drucker() {
        sb.append([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL].format("%-10s%-10s\n", "Name", "Nummer"));
        sb.append([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL].format("%-10s%-10s\n", "====", "======"));
    }

    /**
     * Hinzufühgen einer Liste
     *
     * parameter lists eine List mit Eintrag
     */
    public void add(List<Eintrag> lists) {
        for (Eintrag eintrag : lists) {
            sb.append(eintrag);
        }
    }

    /**
     * Hinzufühgen einer Error Message zum Stringbuilder
     *
     * msg String
     */
    public void addErrorMessage([URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string']String[/URL] msg) {
        sb.setLength(0);
        sb.append(msg);
    }

    /**
     * Ausgabe auf der Konsole
     */
    public void print() {
        if (sb.length() > 42) {
            [URL='http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system']System[/URL].out.println(sb);
        }
    }
}
```


----------



## mihe7 (9. Jul 2018)

In dem Code von Dir sind lauter URL-Tags, das ist kaum lesbar.



pythonjava030 hat gesagt.:


> ich möchte einen TCP-Server implementieren


Warum?



pythonjava030 hat gesagt.:


> Dieses Programm soll auf dem Browser des anderen Rechners ausgeführt werden.


Du meinst, der Browser soll eine Anfrage stellen und Dein Programm soll darauf in einer Form antworten, die der Browser versteht?



pythonjava030 hat gesagt.:


> Leider kenn ich mich mit web sockets kaum aus.


Soweit ich das überblicke hat das mit Web Sockets auch nichts zu tun. Und: weil die ganze Geschichte - vorsichtig ausgedrückt - nicht ganz trivial ist, gibt es dafür fertige Lösungen.



pythonjava030 hat gesagt.:


> ich weiss nicht wie ich den Request richtig aufbauen muss.


Du kannst den Request aufbauen, wie Du willst.

Nachtrag: Beschreib doch einfach mal, was Du wie haben willst. Was soll der Browser machen usw.


----------

