# Java Socket Prog. Client+Server



## yuro (21. November 2011)

Servus 

Hab hier eine Aufgabe wo ich ned weiterkomm.

Und zwar lautet sie:

Folgende Socket-Anwendung (Client+Server) soll das können:

- Server-Prog. läuft nach dem Start kontinuierlich,d.h. kann mehrere Aufgaben nacheinander behandeln.
- Vom Client aus können Sie den Befehl „Sende <Dateiname> <Dateiinhalt>“ abschicken. 
- Der Client sucht in seinem lokalen Verzeichnis und liefert den Inhalt der Datei –falls vorhanden - an den Server. 
- Der Server empfängt den <Dateiinhalt> und speichert den Inhalt unter <Dateiname> in seinem lokalen Verzeichnis
- Vom Client aus können Sie den Befehl „Hole <Dateiname>“ abschicken. Der Server sucht in seinem lokalen Verzeichnis und liefert den Inhalt der Datei –falls vorhanden - an den Client zurück
- Der Inhalt der Datei wird auf der Konsole des Clients ausgegeben
- Vom Client aus können Sie den Befehl „Schliesse“ absetzen. Dieser Befehl bewirkt serverseitig, dass sich das Server-Programm beendet.

Folgende Programme existieren:

```
EchoClient.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class EchoClient {

	public static void main (String []args) throws UnknownHostException, IOException
	{
		// verbinde mit dem rechner unter der ip adresse
		// 127.0.0.1 auf dem port 1565
		Socket socket=new Socket("127.0.0.1",1565);
		// erzeuge kommunikationsendpunkt um daten zu schicken
		PrintWriter printW=new PrintWriter(socket.getOutputStream());
		printW.println("Hallo in Kleiner Schrift\n\r");
		printW.flush();
		//erzeuge kommunikationsendpunkt um daten zu lesen
		BufferedReader bufRead=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		System.out.println("Ausgabe vom Server war"+bufRead.readLine());
	}
	
}
```


```
EchoSocketServer.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class EchoSocketServer {

	public static void main(String[] args) throws IOException {
		// Der dienst wird auf dem port 1565 gestartet
		ServerSocket server=new ServerSocket(1565);
		// warte solange bis ein client eine verbindung herstellt 
		Socket socket=server.accept();
		//erzeuge kommunkationsendpunkt um daten zulesen
		BufferedReader bufRead=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		//eingehende zeile wird eingelesne
		String input=bufRead.readLine();
		//...und auf der kommandozeile ausgegeben
		System.out.println(input);
		//string wird in klein-buchstaben umgewandelt
		input=input.toLowerCase();
		// kommunkationsendpunkt zum schreiben von daten an den client wird erstellt
		PrintWriter printW=new PrintWriter(socket.getOutputStream());
		//daten werden an den client geschickt
		printW.println(input);
		printW.flush();

	}

}
```


```
ReadFromFile.java

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;


public class ReadFromFile {

   
    public static void main(String[] args) {
        ReadFromFile rff=new ReadFromFile();
        rff.readFile();
        
    }
    
    public void readFile()
    {
        // es wir das die Klasse File benutzt um eine Datei input.txt zu referenzieren.
        File file = new File (&quot;input.txt&quot;);
        // Die Klasse Scanner em&ouml;glich es uns einfach mit einem File Objekt zu arbeiten und dessen Inhalt einzulesen
        Scanner scanner = null;
        try {
            // hier verbinde ich die Objekte der Klasse Scanner und File
           scanner = new Scanner (file);
        } catch (FileNotFoundException e) {
          System.out.println (&quot;File not found!&quot;);
         
          System.exit (0);
        }
   
        // solange die methode hasNext im Scanner weitere Zeilen feststellt
        while(scanner.hasNext())
        {
            // es wird eine zeile ausgelesen aus der datei und in der variable tmp gespeichert
            String tmp=scanner.nextLine();
            // die gerade eingelesene Zeile wird auf der Kommandozeile ausgegeben
            System.out.println(tmp);
        }
        
    }

}
```


```
ReadFromConsole.java

import java.util.Scanner;


public class ReadFromConsole {

    public static void main(String[] args) {

        ReadFromConsole rfc = new ReadFromConsole();
        rfc.readIn();
    }

    public void readIn() {
        System.out.println(&quot;Wir m&ouml;chten die Werte von Personen ueber die Konsole einlesen.&quot;);

        Scanner scanner = new Scanner(System.in);
        while (true) {
          
            String tmpName = &quot;&quot;;
            String tmpVorname = &quot;&quot;;
            String tmpWeiter = &quot;&quot;;
            System.out.println(&quot;Bitte geben Sie zuerst den Namen ein:&quot;);
            tmpName = scanner.next();
            System.out.println(&quot;Bitte geben Sie danach den Vornamen ein:&quot;);
            tmpVorname = scanner.next();
            System.out.println(&quot;Die Daten der eingegebenen Person:&quot;+tmpName+&quot; &quot;+tmpVorname);
            System.out
                    .println(&quot;Moechten Sie fortfahren mit der Eingabe (ja/nein):&quot;);
            tmpWeiter = scanner.next();
            if (tmpWeiter.equals(&quot;nein&quot;)) {
                System.out.println(&quot;Programm wird beendet&quot;);
                System.exit(1);
                return;
            }

        }

    }
}
```


----------



## Bratkartoffel (21. November 2011)

Hi,

wo kommst du jetzt nicht weiter, bzw. was ist dein genaues Problem?

Gruß
BK


----------



## sheel (21. November 2011)

...screcno ciao,

Die gezeigten Programme sind also zurzeit unabhängig von der Aufgabe; um zu zeigen, wie die Sachen funktionieren?

Und was HTML-mäßiges ist deinen Quelltexten eigentlich passiert? &quot;?
(Liegt nicht an den Codetags, die funktionieren).

edit: 5 Minuten? Hmmm...


----------



## yuro (21. November 2011)

servus,

also das sind beispiele mit denen wir arbeiten sollen.. bzw. verknüpfen plus die fehlenden funktionen mitprogrammieren! ich weiss nicht wie ich anfangen soll 

edit: sorry die html codes kamen durch den texteditor! sorrrry


----------



## sheel (21. November 2011)

Also,

*Client*:
Zuerst mal ein Programm, das in einer Schleife immer wieder Zeile von der Konsole einliest.

Wenn der Stringanfang Sende ist, nimmst du den Rest des Strings als Dateinamen.
Öffne einen Socket und die Datei zum Namen.
Schick die Zeichenanzahl des Namens über den Socket.
Schick den Namen als Einbytezeichensatz (Iso8859-1 zB.) über den Socket.
Shcick, wieviel Byte die Datei hat.
Lies die Datei ein und schick sie auch über den Socket.
Schließe Datei und Socket.

Wenn der Stringanfang aber Hole war:
Socket öffnen.
Länge vom Dateinamen und Name senden.
Zahl empfangen, die eine Byteanzahl angibt.
So viel Byte empfangen und in eine neue Datei schreiben.
Socket und Datei schließen.


----------



## yuro (22. November 2011)

Muss ich nicht dem Server eine while-Schleife hinzufügen****?

"Wenn der Stringanfang Sende ist, nimmst du den Rest des Strings als Dateinamen." 

wie sieht sowas denn aus****


----------



## sheel (22. November 2011)

Warum machst du nicht zuerst mal den Client, statt Server?

Zum String:
Die Stringklasse hat alle Methoden, die du dafür brauchst..
warum schaust du nicht einfach einmal nach?
Mit indexOf suchst du das erste Leerzeichen (oder den ersten Tabulator).
Mit substring bekommst dan einereits den Teil vor der gefundenen Stelle
(zum Prüfen auf "Sende" etc.), andererseits den anderen Stringteil (=Dateiname).

Und bitte schick nicht dauernd PNs.
Ich seh deine neuen Beiträge auch so.
Bin eben auch nicht _immer_ online,,,


----------



## schnuffie (1. Dezember 2011)

Als Freund von Strukturierung würde ich erstmal damit anfangen, eine definierte Schnittstelle zu bilden, da auf Client- und Server-Seite jeweils Dateien gelesen bzw. geschrieben werden sollen. Auch wäre es sinnvoll, die Operationen als enum zu definieren. Nebenbei ist auf beiden Seiten jeweils vom Stream zu lesen und in den Stream zu schreiben. Deployen würde ich dann einen "Shared"-Teil (= die gemeinsam verwendeten Dateien) auf Client und Server und dann je nachdem den Client- und den Server-Teil.

Danach ist es jetzt relativ easy, die einzelnen Teile nacheinander zu implementieren und die Implementierungen erstmal ohne die Sockets zu testen, das macht das Ganze einfacher.


----------

