Socket Client-Server-Programmierung

ebruss17

Bekanntes Mitglied
Hallo Leute,

ich studiere derzeit Wirtschaftsinformatik. Im Fach Programmieren mit Java müssen wir jede Woche Projekte abgeben, die dann auch benotet werden und Voraussetzung für das Bestehen des Faches ist. Ich habe eine Aufgabenstellung, indem eine Client-Server-Verbindung und ein Datenaustausch via Sockets realisiert werden muss. Ich kann auch meine Aufgabenstellung bei Antworten mitzuschicken. Da ich dringend Hilfe benötige, wäre ich sehr dankbar, wenn sich Java-Profis melden würden. Nochmals vielen Dank
 
G

Gast2

Gast
Du suchst jemanden der dir deine Aufgaben löst? Dann passt der Post wohl besser in die Jobbörse.
 

ebruss17

Bekanntes Mitglied
Hallo EikeB,

ich glaub du hast mich missverstanden, ich habe gerade ein lauffähiges Java-Programm geschrieben, jedoch funktioniert die Kommunikation zwischen Client und Server noch nicht so ganz richtig ....
 

ebruss17

Bekanntes Mitglied
import java.io.*;
import java.net.Socket;


/**
* @author zengin
* Die Klasse ControlerThread dient dazu, die Klasse ViewThread und die Klasse ModelThread
* also die beiden Threads via Pipe miteinander zu verbinden und anschliessend zu starten.
*/
public class ControlerThread
{

/**
* @param args
* @throws ClassNotFoundException
* @throws IOException
* Die main-Methode dient dazu, die beiden Threads (ModelThread und ViewThread) über
* die Pipe zum Laufen zu bringen.
* Innerhalb der main-Methode werden als erstes PipedReader und PipedWriter erzeugt.
* Anschliessend werden PipedReader und PipedWriter miteinander verbunden.
* Im nächsten Schritt wird ein neues ViewThread t1 und ein neues ModelThread t2 erzeugt,
* der ViewThread t1 bekommt als Parameter pr2 und pw1 und der ModelThread t2
* bekommt als Parameterübergabe pr1 und pw2. Dann werden die neu erzeugten Threads
* anschliessend asynchron gestartet.
* pw1 also die Pipe1 schreibt vom ViewThread zum ModelThread
* und pw2 also Pipe2 schreibt vom ModelThread zum ViewThread.
*/
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException
{

String requestToServer;

String ipadresse = Input.readString("Geben Sie bitte die IP-Adresse zum Verbinden ein: ");
Socket clientSocket = new Socket(ipadresse, 45678);



System.out.println("Verbindung zum Server mit der Adresse "
+ clientSocket.getInetAddress() + " wurde hergestellt.");

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
clientSocket.getOutputStream()));

BufferedReader in = new BufferedReader(new InputStreamReader(
System.in));

PipedReader pr1 = new PipedReader();
PipedWriter pw1 = new PipedWriter();

PipedReader pr2 = new PipedReader();
PipedWriter pw2 = new PipedWriter();

PipedReader prControllerVonModel = new PipedReader();
PipedReader prControllerVonView = new PipedReader();
PipedWriter pwControllerZuModel = new PipedWriter();
PipedWriter pwControllerZuView = new PipedWriter();

pwControllerZuModel.connect(pr1);
pwControllerZuView.connect(pr2);
pw2.connect(prControllerVonModel);
pw1.connect(prControllerVonView);

ViewThread t1 = new ViewThread(pr2, pw1);
ModelThread t2 = new ModelThread(pr1, pw2);

t1.start(); //asynchroner Start
t2.start(); // asynchroner Start

int a;

while (true)
{
try
{
a = prControllerVonView.read();
requestToServer = "" + a;
bw.write(requestToServer);
bw.newLine();
bw.flush();
pwControllerZuModel.write(a);
prControllerVonModel.read();
pwControllerZuView.write(0);

}


catch (Exception e)
{
e.printStackTrace();
System.exit(1);
}








}
}
}





import java.io.*;
import java.util.*;



/**
* @author zengin
*/
public class ModelThread extends Thread
{

File csvdatei = new File("adreli.csv");


public static ArrayList<Person> personen = new ArrayList<Person>();


private PipedReader reader;
private PipedWriter writer;


/**
* Konstruktor mit 2 Parametern.
* @param reader
* @param writer
*/
public ModelThread(PipedReader reader, PipedWriter writer)
{

super("ModelThread");
this.reader = reader;
this.writer = writer;
}


/**
* Die Klasse ModelThread wird über die sogenannte Pipe mithilfe dieser Methode zum Laufen gebracht.
* Falls die Eingaben aus der ViewThread-Klasse gelesen wurden, kann somit jetzt die jeweilige Methode
* ausgeführt werden. Der Thread der Benutzerseite wird gestartet.
* int a = reader.read(); liest von der Pipe, welcher Casefall eingegeben wurde.
* Mithilfe der Methode-write wird an das Hauptmenü ein Signal übergeben.
* Der Programmlauf wird in diesem Fall an die ViewThread-Klasse übergeben.
* Sobald die Eingabe aus der Klasse ViewThread gelesen ist, wird die jeweilige
* Methode der Klasse ModelThread ausgeführt.
*/
public void run()
{
while (true)
{

try
{
int a = reader.read(); // es liest von der Pipe, welcher casefall eingegeben worden ist.
switch (a)
{

case 1: // eine neue Person aufnehmen

personeneingabe();
break;

case 2: // Records auflisten
personenausgabe();
break;

case 3: // Records in eine Datei sichern
sichern(personen);
break;

case 4: // Datei löschen
fileLoeschen();
break;

case 5: // das Programm verlassen
programmbeenden();
break;

default: // Falsche Zahl eingegeben
System.out
.println("Sie haben keine gültige Zahl eingegeben, bitte geben Sie eine Zahl von 1 - 5 ein!");
}

writer.write(a);
}
catch (IOException io)
{
System.out.println("Es ist ein Fehler im ModelThread aufgetreten:" + "\n" + io.getMessage());
}
}
}


/**
* 2. while-Schleife fragt ab, ob Eingaben korrekt sind. Wenn die Eingaben korrekt sind,
* werden die Personenobjekte mit dem Befehl personen.add(p) in die ArrayList personen eingetragen.
*/
public void eingabenkorrektheit()
{
boolean beenden = false;
while (!beenden)
{
System.out.println();
System.out.println("Geben Sie bitte Ihre Daten ein: ");
System.out.println();
Person p = new Person();
p.readPerson();

while (!beenden)
{
String antwort =Input.readString(
"Sind Ihre Eingaben korrekt?\n(J/j = Ja, N/n = Nein)");

if (antwort.equals("J") || antwort.equals("j"))
{
beenden = true;

}
else if (antwort.equals("N") || antwort.equals("n"))
{
p.readPerson();
beenden = false;
}
else
{
System.out.println(
"Ihre Eingabe ist nicht gültig, bitte nochmals versuchen!\n");
beenden = false;
}

}
personen.add(p);

String antwort = Input.readString(
"Möchten Sie noch weitere Personendaten aufnehmen?\n(J/j = Ja, N/n = Nein)",
"[jJnN]",
"Ihre Eingabe war leider fehlerhaft, bitte versuchen Sie es erneut!");

if (antwort.equals("J") || antwort.equals("j"))
{
beenden = false;
}
else if (antwort.equals("N") || antwort.equals("n"))
{
beenden = true;
}
else
{
System.out.println("Sie haben eine ungültige Eingabe betätigt, bitte erneut versuchen!\n");
beenden = false;
}
}
}


/**
* diese Methode ruft die Methode eingabenkorrektheit() auf, um abfragen zu können,
* ob die eingegebenen Personeninformationen korrekt sind oder nicht.
* Und ob der Benutzer noch weitere Personendaten aufnehmen möchte.
*
*/
public void personeneingabe()
{
eingabenkorrektheit();
}


/**
* Die Personeninformationen, die im ArrayList personen gespeichert wurden, werden mithilfe
* der Methode personenausgabe() einzeln, satzweise und nacheinander aufgelistet auf dem
* Bildschirm angezeigt.
*/
public void personenausgabe()
{
for (int i = 0; i<personen.size(); i++)
{
System.out.println(i+1+"."+"Satz");
System.out.println();
System.out.println(personen.get(i).toString());
Input.readString("Betätigen Sie bitte die <RETURN> - Taste um weiterzukommen\n");
}
}


/**
* @param personen (ArrayList)
* Auslagerung der Informationen von Personobjekten in die
* Datei adreli.csv. FileWriter dient dazu, dass die
* entsprechenden Personendaten char-artig in die Datei adreli.csv
* geschrieben werden. Anhand der for-Schleife werden die
* einzelnen Attribute mittels BufferedWriter in die Datei
* geschrieben, jedoch getrennt und nicht hintereinander.
*/
public void sichern(ArrayList<Person> personen)
{
try {

BufferedWriter bw = new BufferedWriter(new FileWriter("adreli.csv"));


for (Person p : personen)
{

bw.write(p.name + ";");
bw.write(p.vorname + ";");
bw.write(p.anrede + ";");
bw.write(p.strasse + ";");
bw.write(p.plz + ";");
bw.write(p.ort + ";");
bw.write(p.telefon + ";");
bw.write(p.fax + ";");
bw.write(p.bemerkung + ";" + "\n");
}

bw.close();

System.out.println("Ihre Daten wurden in die Datei adreli.csv gespeichert!");

}
catch (IOException e)
{
System.out.println(e.getMessage());

}
}


/**
* loescht Datei "adreli.csv" zusammen mit gespeicherten
* Personendaten von der Festplatte. Im try-Block wird versucht, die neu
* angelegte Datei adreli.csv von der Festplatte zu löschen. Falls es gelöscht
* wurde, soll auf dem Bildschrirm ausgegeben werden, dass die Datei adrelicsv
* erfolgreich gelöscht wurde. Im anderen Fall, falls es die Datei auf der Festplatte
* nicht gibt, soll eine Fehlermeldung ausgegeben werden, dass die Datei
* adreli.csv auf der Festplatte nicht vorhanden ist.
*/
public static void fileLoeschen()
{
try {
File datei = new File("adreli.csv");

if(datei.exists())
{
datei.delete();
System.out.println("Die Datei " + "adreli.csv" + " wurde erfolgreich gelöscht.\n");
}
else
{
System.out
.println("Die Datei adreli.csv ist auf der Festplatte leider nicht vorhanden.\n");
}
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
}


/**
* Mithilfe der Methode programmbeenden hat der Benutzer die Möglichkeit
* das Programm erfolgreich zu verlassen. System.exit(0); dient in dieser
* Methode dazu, damit der Benutzer das Programm vorzeitig beenden kann.
*/
public static void programmbeenden()
{
System.exit(0);

}

}



import java.io.Serializable;


/**
* Mithilfe der Klasse "Person" werden Daten über Personen erfasst
* @author zengin
*/
public class Person implements Serializable
{

public String name;
public String vorname;
public String anrede;
public String strasse;
public String plz;
public String ort;
public String telefon;
public String fax;
public String bemerkung;


static final long serialVersionUID = 0L;



/**
* überprüft den eingegebenen Namen mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
public void read_in_Name()
{
System.out.println("(z.B. Musterfrau)");
name = Input.readString("Name: ","([A-ZÖÜ][a-zöü]+)",
"\nGeben Sie Ihren Namen bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft den eingegebenen Vorname mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Vorname()
{
System.out.println("(z.B. Maria)");
System.out.println("(z.B. Ana-Marie)");
vorname = Input.readString("Vorname: ",
"([A-ZÖÜ][a-zöü]+)|([A-ZÖÜ][a-zöü]+[-][A-ZÖÜ][a-zöü]+)",
"\nGeben Sie Ihren Vornamen bitte nach dem Muster des angezeigten Beispiels ein! ");
}


/**
* überprüft die eingegebene Anrede mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Anrede()
{
System.out.println("(z.B. Frau oder Herr)");
anrede = Input.readString("Anrede: ","(Herr|Frau)",
"Diese Anrede wird leider nicht akzeptiert, bitte geben Sie Herr oder Frau ein! ");
}


/**
* überprüft die eingegebene Strasse mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Strasse()
{
System.out.println("(z.B. Musterstrasse 1)");
System.out.println("(oder Unterer Hofweg 1)");
strasse = Input.readString("Strasse: ",
"([A-ZÖÜ][a-zöüß]+[/ ][0-9]+)|([A-ZÖÜ][a-zöüß]+[/ ][A-ZÖÜ][a-zöüß]+[/ ][0-9]+)",
"\nGeben Sie Ihre Strasse bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Postleitzahl mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Plz()
{
System.out.println("(z.B. D-12345)");
plz = Input.readString("PLZ: ", "[A-Z]+[-][0-9]{1,5}",
"\nGeben Sie Ihre PLZ bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft den eingegebenen Ort mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Ort()
{
System.out.println("(z.B. Musterort)");
ort = Input.readString("Ort: ", "([A-Z][a-z]+)|([A-ZÖÜ][a-zöü]+)",
"\nGeben Sie Ihren Ort bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Telefonnummer mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Telefon()
{
System.out.println("(z.B. +49 12345-12345");
System.out.println("(z.B. 12345-12345");
telefon = Input.readString("Telefon: ", "([/+][0-9]{2}[/ ])?[0-9]+[/-][0-9]+",
"\nGeben Sie Ihre Telefonnummer bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Faxnummer mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Fax()
{
System.out.println("(z.B. +49 12345-12345)");
System.out.println("(oder 12345-12345");
fax = Input.readString("Fax: ", "([/+][0-9]{2}[/ ])?[0-9]+[/-][0-9]+",
"\nGeben Sie Ihre Faxnummer bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Bemerkung mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Bemerkung()
{
System.out.println("Sie muessen nichts eingeben!");
bemerkung = Input.readString("Bemerkung: ");
}


/**
* Sammlung von Methoden
*/
public Person readPerson()
{
read_in_Name();
read_in_Vorname();
read_in_Anrede();
read_in_Strasse();
read_in_Plz();
read_in_Ort();
read_in_Telefon();
read_in_Fax();
read_in_Bemerkung();

return null;
}


/**
* Ueberschriebene toString-Methode zur angepassten Ausgabe von Personenobjekten.
*/
public String toString()
{
String out = "Name: " + name + "\nVorname: " + vorname
+ "\nAnrede: " + anrede + "\nStrasse: " + strasse + "\nPLZ: "
+ plz + "\nOrt: " + ort + "\nTelefon: " + telefon + "\nFax:"
+ fax + "\nBemerkung: " + bemerkung;
return out;
}

}








import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;

/**
* Die Klasse ViewThread gibt das Hauptmenü aus. Das Hauptmenü wird
* anschliessend per Socket an den Server geschickt.
* Über Pipes findet die Kommunikation zwischen ControlerThread und
* ViewThread statt.
* @author zengin
*/
public class ViewThread extends Thread
{


private PipedReader reader;
private PipedWriter writer;


/**
* @param reader
* @param writer
* Der Konstruktor ViewThread mit 2 Parameterübergaben (PipedReader und PipedWriter).
* PipedReader reader ist dazu da, um die Eingaben aus einem beliebigen Reader zu lesen.
* PipedWriter writer ist dazu da, um die Ausgabe in einen beliebigen Writer zu schreiben.
*/
public ViewThread(PipedReader reader, PipedWriter writer)
{
super("ViewThread");
this.reader = reader;
this.writer = writer;
}



/**
* Diese überschriebene run-Methode der Thread-Klasse ruft
* die Methode hauptmenu auf und führt diese anschliessend aus.
*/
public void run()
{
hauptmenu();

}


/**
* Das Hauptmenü wird auf der Konsole angezeigt.
* Innerhalb des try-Blocks findet die Kommunikation der Pipes statt.
* Es werden die Eingaben an die Klasse ModelThread über das Objekt
* PipedWriter geschickt.
* Anschliessend wird aus der Klasse ModelThread über das Objekt
* PipedReader gelesen.
*/
public void hauptmenu()
{
while(true)
{
System.out.println("\r===========================");
System.out.println(" ADRELI - Adressverwaltung ");
System.out.println("===========================");
System.out.println();
System.out.println("Wollen Sie...");
System.out.println();

//BILDSCHIRMMENUE
System.out.println(" eine neue Person aufnehmen: > 1");
System.out.println(" Records auflisten: > 2");
System.out.println("Records in eine Datei sichern: > 3");
System.out.println(" Datei löschen: > 4");
System.out.println(" das Programm verlassen: > 5");

int a = Input.readInt();
System.out.println("------------------------------------");
System.out.println();

if (a == 5) {
System.out.println("\n" + "\n" + "Sie haben das Programm erfolgreich verlassen.");
System.exit(1);
} else {
try
{
writer.write(a);
reader.read();
}
catch(IOException io)
{
System.out.println("Fehler in ViewThread:" + "\n" + io.getMessage());
}
}
}

}
}




import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io_OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.ArrayList;
import java.util.Date;

/**
* Die Klasse Controller des Servers bietet die Kommunikation des Clients mit
* dem Server über den Socket 12345. Außderdem kontrolliert er die Pipe-
* Kommunikation zwischen den Threads des Servers. Bei jeder Aktivität erstellt
* der Controller einen neuen Eintrag im Log-File 'logfile.csv'mit Zeitstempel.
* @author zengin
*/
public class Server {

File serverdatei = new File("logfile.csv");
private static ArrayList<String> eintragsliste = new ArrayList<String>();


/**
* Die Main kümmert sich um die Kommunikation des Servers mit dem Client via
* Sockets und erstellt auch ein zu Beginn leeres Logfile. Außerdem regelt
* sie den Datenverkehr der Threads des Servers. Hier wird ein Zeit- und
* Datumsformat definiert, dass dann auf der Konsole zu den einzelnen
* Aktionen angezeigt und im Logfile gespeichert wird.
*
* @param args
* @throws IOException
*/
public static void main(String[] args) throws Exception {

System.out.println(">>> Der Server wird gestartet");

@SuppressWarnings("resource")
ServerSocket myServerSocket = new ServerSocket(45678);



while (true) {

Socket myClientSocket = myServerSocket.accept();

BufferedReader br = new BufferedReader(new InputStreamReader(
myClientSocket.getInputStream()));

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
myClientSocket.getOutputStream()));

Calendar cal = Calendar.getInstance();

SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss ");
System.out.println( formater.format(cal.getTime()) );

Date currentTime = new Date();

String anmeldung = formater.format(currentTime) + ";"
+ "Angemeldet an lokaler Adresse" + ";"
+ myClientSocket.getLocalAddress() + "\n";

eintragsliste.add(anmeldung);

schreibeLog(eintragsliste);

System.out.println("--> Local Address angemeldet: "
+ myClientSocket.getLocalAddress());
String s;

try {
while ((s = br.readLine()) != null)
{

int a = Integer.parseInt(s);

if ((a < 6) && (a > 0)) {
formater = new SimpleDateFormat("HH:mm:ss ");
currentTime = new Date();
auswahl(a, currentTime);
schreibeLog(eintragsliste);

System.out.println("> " + formater.format(currentTime)
+ "\n" + "Sie haben den Menuepunkt \'"
+ a + "\' ausgewaehlt");

bw.write("okay");
bw.newLine();
bw.flush();
} else {
auswahl(a, currentTime);
schreibeLog(eintragsliste);
System.out.println("> " + formater.format(currentTime)
+ "\n" + "Ungueltige Eingabe!");
bw.write("nicht okay");
bw.newLine();
bw.flush();

}
}
}
catch (Exception e) {
System.out.println(e.getMessage());
}


System.out.println("<-- LocalAddress: "
+ myClientSocket.getLocalAddress());

currentTime = new Date();

String abmeldung = formater.format(currentTime) + ";"
+ "Abgemeldet von der lokalen Adresse" + ";"
+ myClientSocket.getLocalAddress() + "\n";

eintragsliste.add(abmeldung);
schreibeLog(eintragsliste);
myClientSocket.close();
}
}


/**
* Diese Methode formatiert die Log-File Einträge und fügt diese dann durch
* den Aufruf der Methode 'schreibeLog' dem Log-File 'logfile.csv' hinzu.
*
* @param a
* @param zeit
*/
public static void auswahl(int a, Date zeit) {
StringBuilder gebeString = new StringBuilder();
gebeString.append(zeit);
gebeString.append(";");

switch (a) {
case 1:
gebeString.append("Menüpunkt ");
gebeString.append(a);
gebeString.append(";");
gebeString.append("neue Person aufnehmen");
gebeString.append(";");
break;
case 2:
gebeString.append("Menüpunkt ");
gebeString.append(a);
gebeString.append(";");
gebeString.append("Records auflisten");
gebeString.append(";");
break;
case 3:
gebeString.append("Menüpunkt ");
gebeString.append(a);
gebeString.append(";");
gebeString.append("Records in eine Datei sichern");
gebeString.append(";");
break;
case 4:
gebeString.append("Menüpunkt ");
gebeString.append(a);
gebeString.append(";");
gebeString.append("Datei löschen");
gebeString.append(";");
break;
default:
break;
}

gebeString.append("\n");

eintragsliste.add(gebeString.toString());
}


/**
* Diese Methode schreibt die Einträge in die serverdatei "logfile.csv".
*/
public static void schreibeLog(ArrayList<String> eintragsliste) {
try {

BufferedWriter bw = new BufferedWriter(new FileWriter("logfile.csv"));

for (int i = 0; i < eintragsliste.size(); i++) {
bw.write(eintragsliste.get(i));
}

bw.close();

} catch (Exception e) {
System.out.println(e.getMessage());
}
}


}
 
T

trääät

Gast
wie groß , rot und fett sollen wir es eigentlich noch schreiben ?

Java™ Quelltext ist bitte in
Java:
[/b]-Tags zu schreiben: [c][noparse][code=Java]hier Java Code einfügen
[/noparse][/c]
 

ebruss17

Bekanntes Mitglied
Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.ArrayList;
import java.util.Date;

/**
 * Die Klasse Controller des Servers bietet die Kommunikation des Clients mit
 * dem Server über den Socket 12345. Außderdem kontrolliert er die Pipe-
 * Kommunikation zwischen den Threads des Servers. Bei jeder Aktivität erstellt
 * der Controller einen neuen Eintrag im Log-File 'logfile.csv'mit Zeitstempel
 */
public class Server {

    File serverdatei = new File("logfile.csv");
    private static ArrayList<String> eintragsliste = new ArrayList<String>();

    
    /**
     * Die Main kümmert sich um die Kommunikation des Servers mit dem Client via
     * Sockets und erstellt auch ein zu Beginn leeres Logfile. Außerdem regelt
     * sie den Datenverkehr der Threads des Servers. Hier wird ein Zeit- und
     * Datumsformat definiert, dass dann auf der Konsole zu den einzelnen
     * Aktionen angezeigt und im Logfile gespeichert wird.
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws Exception {
    	
        System.out.println(">>> Der Server wird gestartet");
        
        @SuppressWarnings("resource")
		ServerSocket myServerSocket = new ServerSocket(45678);

      
       
        while (true) {
        	
            Socket myClientSocket = myServerSocket.accept();

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    myClientSocket.getInputStream()));

            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                    myClientSocket.getOutputStream()));

            Calendar cal = Calendar.getInstance();
            
            SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss ");
            System.out.println( formater.format(cal.getTime()) );
            
            Date currentTime = new Date();

            String anmeldung = formater.format(currentTime) + ";"
                    + "Angemeldet an lokaler Adresse" + ";"
                    + myClientSocket.getLocalAddress() + "\n";

            eintragsliste.add(anmeldung);

            schreibeLog(eintragsliste);

            System.out.println("--> Local Address angemeldet: "
                    + myClientSocket.getLocalAddress());
            String s;

            try {
                while ((s = br.readLine()) != null) 
                {
           
                    int a = Integer.parseInt(s);

                    if ((a < 6) && (a > 0)) {
                        formater = new SimpleDateFormat("HH:mm:ss ");
                        currentTime = new Date();
                        auswahl(a, currentTime);
                        schreibeLog(eintragsliste);

                        System.out.println("> " + formater.format(currentTime)
                                + "\n" + "Sie haben den Menuepunkt \'"
                                + a + "\' ausgewaehlt");

                        bw.write("okay");
                        bw.newLine();
                        bw.flush();
                    } else {
                        auswahl(a, currentTime);
                        schreibeLog(eintragsliste);
                        System.out.println("> " + formater.format(currentTime)
                                + "\n" + "Ungueltige Eingabe!");
                        bw.write("nicht okay");
                        bw.newLine();
                        bw.flush();
                       
                    }
                }
            }
            catch (Exception e) {
            	System.out.println(e.getMessage());
            }
            
            
            System.out.println("<-- LocalAddress: "
                    + myClientSocket.getLocalAddress());
            
            currentTime = new Date();
            
            String abmeldung = formater.format(currentTime) + ";"
                    + "Abgemeldet von der lokalen Adresse" + ";"
                    + myClientSocket.getLocalAddress() + "\n";
            
            eintragsliste.add(abmeldung);
            schreibeLog(eintragsliste);
            myClientSocket.close();
        }
    }
    
    
    /**
     * Diese Methode formatiert die Log-File Einträge und fügt diese dann durch
     * den Aufruf der Methode 'schreibeLog' dem Log-File 'logfile.csv' hinzu.
     *
     * @param a
     * @param zeit
     */
    public static void auswahl(int a, Date zeit) {
        StringBuilder gebeString = new StringBuilder();
        gebeString.append(zeit);
        gebeString.append(";");

        switch (a) {
            case 1:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("neue Person aufnehmen");
                gebeString.append(";");
                break;
            case 2:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("Records auflisten");
                gebeString.append(";");
                break;
            case 3:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("Records in eine Datei sichern");
                gebeString.append(";");
                break;
            case 4:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("Datei löschen");
                gebeString.append(";");
                break;
            default:
                break;
        }

        gebeString.append("\n");

        eintragsliste.add(gebeString.toString());
    }

   
    /**
     * Diese Methode schreibt die Einträge in die serverdatei "logfile.csv".
     */
    public static void schreibeLog(ArrayList<String> eintragsliste) {
        try {
       
            BufferedWriter bw = new BufferedWriter(new FileWriter("logfile.csv"));

            for (int i = 0; i < eintragsliste.size(); i++) {
                bw.write(eintragsliste.get(i));
            }

            bw.close();
           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    
}


Java:
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;

/**
 * Die Klasse ViewThread gibt das Hauptmenü aus. Das Hauptmenü wird 
 * anschliessend per Socket an den Server geschickt.
 * Über Pipes findet die Kommunikation zwischen ControlerThread und
 * ViewThread statt.
 */
public class ViewThread extends Thread
{


  private  PipedReader reader;
  private  PipedWriter writer;
  

/**
* @param reader
* @param writer 
* Der Konstruktor ViewThread mit 2 Parameterübergaben (PipedReader und PipedWriter). 
* PipedReader reader ist dazu da, um die Eingaben aus einem beliebigen Reader zu lesen.
* PipedWriter writer ist dazu da, um die Ausgabe in einen beliebigen Writer zu schreiben.
*/
public ViewThread(PipedReader reader, PipedWriter writer)
{
  super("ViewThread");
  this.reader = reader;
  this.writer = writer;
}

  

/**
 * Diese überschriebene run-Methode der Thread-Klasse ruft
 * die Methode hauptmenu auf und führt diese anschliessend aus.
 */
public void run()
{
  hauptmenu();

}


/**
* Das Hauptmenü wird auf der Konsole angezeigt.
* Innerhalb des try-Blocks findet die Kommunikation der Pipes statt.
* Es werden die Eingaben an die Klasse ModelThread über das Objekt
* PipedWriter geschickt. 
* Anschliessend wird aus der Klasse ModelThread über das Objekt  
* PipedReader gelesen.
*/
public void hauptmenu()
{
	while(true)
  {
    System.out.println("\r===========================");
    System.out.println(" ADRELI - Adressverwaltung ");
    System.out.println("===========================");
    System.out.println();
    System.out.println("Wollen Sie...");
    System.out.println();

    //BILDSCHIRMMENUE
    System.out.println("   eine neue Person aufnehmen: > 1");
    System.out.println("            Records auflisten: > 2");
    System.out.println("Records in eine Datei sichern: > 3");
    System.out.println("                Datei löschen: > 4");
    System.out.println("       das Programm verlassen: > 5");

    int a = Input.readInt();
    System.out.println("------------------------------------");
    System.out.println();

    if (a == 5) {
        System.out.println("\n" + "\n" + "Sie haben das Programm erfolgreich verlassen.");
        System.exit(1);
    } else {
    try
    {
     writer.write(a);
     reader.read();
    }
    catch(IOException io)
    {
      System.out.println("Fehler in ViewThread:" + "\n" +  io.getMessage());
    }
  }
}

}
}





Java:
import java.io.Serializable;


/**
 *  Mithilfe der Klasse "Person" werden Daten über Personen erfasst
 */
public class Person implements Serializable  
{

	public String name;
	public String vorname;
	public String anrede;
	public String strasse;
	public String plz;
	public String ort;
	public String telefon;
	public String fax;
	public String bemerkung;


	static final long serialVersionUID = 0L;



/**
* überprüft den eingegebenen Namen mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
public void read_in_Name()
{
	System.out.println("(z.B. Musterfrau)");
	name = Input.readString("Name: ","([A-ZÖÜ][a-zöü]+)",
			"\nGeben Sie Ihren Namen bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft den eingegebenen Vorname mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Vorname()
{
	System.out.println("(z.B. Maria)");
	System.out.println("(z.B. Ana-Marie)");
	vorname = Input.readString("Vorname: ",
			"([A-ZÖÜ][a-zöü]+)|([A-ZÖÜ][a-zöü]+[-][A-ZÖÜ][a-zöü]+)",
			"\nGeben Sie Ihren Vornamen bitte nach dem Muster des angezeigten Beispiels ein! ");
}


/**
* überprüft die eingegebene Anrede mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Anrede()
{
	System.out.println("(z.B. Frau oder Herr)");
	anrede = Input.readString("Anrede: ","(Herr|Frau)",
			"Diese Anrede wird leider nicht akzeptiert, bitte geben Sie Herr oder Frau ein!  ");
}


/**
* überprüft die eingegebene Strasse mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Strasse()
{
	System.out.println("(z.B. Musterstrasse 1)");
	System.out.println("(oder Unterer Hofweg 1)");
	strasse = Input.readString("Strasse: ",
			"([A-ZÖÜ][a-zöüß]+[/ ][0-9]+)|([A-ZÖÜ][a-zöüß]+[/ ][A-ZÖÜ][a-zöüß]+[/ ][0-9]+)",
			"\nGeben Sie Ihre Strasse bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Postleitzahl mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Plz()
{
	System.out.println("(z.B. D-12345)");
	plz = Input.readString("PLZ: ", "[A-Z]+[-][0-9]{1,5}",
		"\nGeben Sie Ihre PLZ bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft den eingegebenen Ort mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Ort()
{
	System.out.println("(z.B. Musterort)");
	ort = Input.readString("Ort: ", "([A-Z][a-z]+)|([A-ZÖÜ][a-zöü]+)",
		"\nGeben Sie Ihren Ort bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Telefonnummer mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Telefon()
{
	System.out.println("(z.B. +49 12345-12345");
	System.out.println("(z.B. 12345-12345");
	telefon = Input.readString("Telefon: ", "([/+][0-9]{2}[/ ])?[0-9]+[/-][0-9]+",
			"\nGeben Sie Ihre Telefonnummer bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Faxnummer mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Fax()
{
	System.out.println("(z.B. +49 12345-12345)");
	System.out.println("(oder 12345-12345");
	fax = Input.readString("Fax: ", "([/+][0-9]{2}[/ ])?[0-9]+[/-][0-9]+",
		"\nGeben Sie Ihre Faxnummer bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Bemerkung mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Bemerkung()
{
	System.out.println("Sie muessen nichts eingeben!");
	bemerkung = Input.readString("Bemerkung: ");
}


/**
*  Sammlung von Methoden
*/
public Person readPerson()
{
	read_in_Name();
	read_in_Vorname();
	read_in_Anrede();
	read_in_Strasse();
	read_in_Plz();
	read_in_Ort();
	read_in_Telefon();
	read_in_Fax();
	read_in_Bemerkung();

	return null;
}


/**
*  Ueberschriebene toString-Methode zur angepassten Ausgabe von Personenobjekten.
*/
public String toString() 
{
		String out = "Name: " + name + "\nVorname: " + vorname
				+ "\nAnrede: " + anrede + "\nStrasse: " + strasse + "\nPLZ: "
				+ plz + "\nOrt: " + ort + "\nTelefon: " + telefon + "\nFax:"
				+ fax + "\nBemerkung: " + bemerkung;
		return out;
}

}



Java:
import java.io.*;
import java.util.*;



/**
 *
 */
public class ModelThread extends Thread
{

  File csvdatei = new File("adreli.csv");


  public static ArrayList<Person> personen = new ArrayList<Person>();

  
  private PipedReader reader;
  private PipedWriter writer;
  

/**
* Konstruktor mit 2 Parametern.
* @param reader
* @param writer
*/
public ModelThread(PipedReader reader, PipedWriter writer)
{

  super("ModelThread");
  this.reader = reader;
  this.writer = writer;
}


/**
* Die Klasse ModelThread wird über die sogenannte Pipe mithilfe dieser Methode zum Laufen gebracht.
* Falls die Eingaben aus der ViewThread-Klasse gelesen wurden, kann somit jetzt die jeweilige Methode
* ausgeführt werden. Der Thread der Benutzerseite wird gestartet.
* int a = reader.read(); liest von der Pipe, welcher Casefall eingegeben wurde.
* Mithilfe der Methode-write wird an das Hauptmenü ein Signal übergeben.
* Der Programmlauf wird in diesem Fall an die ViewThread-Klasse übergeben.
* Sobald die Eingabe aus der Klasse ViewThread gelesen ist, wird die jeweilige
* Methode der Klasse ModelThread ausgeführt.
*/
public void run()
{
  while (true)
  {

    try
    {
      int a = reader.read(); // es liest von der Pipe, welcher casefall eingegeben worden ist.
        switch (a)
        {

        case 1: // eine neue Person aufnehmen

          personeneingabe();
          break;

        case 2: // Records auflisten
          personenausgabe();
          break;

        case 3: // Records in eine Datei sichern
          sichern(personen);
          break;

        case 4: // Datei löschen
          fileLoeschen();
          break;

        case 5: // das Programm verlassen
          programmbeenden();
          break;

        default: // Falsche Zahl eingegeben
          System.out
          .println("Sie haben keine gültige Zahl eingegeben, bitte geben Sie eine Zahl von 1 - 5 ein!");
        }

        writer.write(a);
      }
      catch (IOException io)
      {
        System.out.println("Es ist ein Fehler im ModelThread aufgetreten:" + "\n" + io.getMessage());
      }
  }
}


/**
* 2. while-Schleife fragt ab, ob Eingaben korrekt sind. Wenn die Eingaben korrekt sind,
* werden die Personenobjekte mit dem Befehl personen.add(p) in die ArrayList personen eingetragen.
*/
public void eingabenkorrektheit()
{
  boolean beenden = false;
    while (!beenden)
    {
      System.out.println();
      System.out.println("Geben Sie bitte Ihre Daten ein: ");
    System.out.println();
    Person p = new Person();
    p.readPerson();

     while (!beenden)
     {
               String antwort =Input.readString(
                        "Sind Ihre Eingaben korrekt?\n(J/j = Ja, N/n = Nein)");

               if (antwort.equals("J") || antwort.equals("j"))
                {
                  beenden = true;

                }
                else if (antwort.equals("N") || antwort.equals("n"))
                {
                  p.readPerson();
                    beenden = false;
                }
                else
                {
                    System.out.println(
                        "Ihre Eingabe ist nicht gültig, bitte nochmals versuchen!\n");
                    beenden = false;
                }

    }
            personen.add(p);

            String antwort = Input.readString(
                "Möchten Sie noch weitere Personendaten aufnehmen?\n(J/j = Ja, N/n = Nein)",
          "[jJnN]",
          "Ihre Eingabe war leider fehlerhaft, bitte versuchen Sie es erneut!");

            if (antwort.equals("J") || antwort.equals("j"))
            {
                beenden = false;
            }
            else if (antwort.equals("N") || antwort.equals("n"))
            {
                beenden = true;
            }
            else
            {
                System.out.println("Sie haben eine ungültige Eingabe betätigt, bitte erneut versuchen!\n");
                beenden = false;
            }
     }
}


/**
 * diese Methode ruft die Methode eingabenkorrektheit() auf, um abfragen zu können,
 * ob die eingegebenen Personeninformationen korrekt sind oder nicht.
 * Und ob der Benutzer noch weitere Personendaten aufnehmen möchte.
 *
 */
public void personeneingabe()
{
  eingabenkorrektheit();
}


/**
* Die Personeninformationen, die im ArrayList personen gespeichert wurden, werden mithilfe
* der Methode personenausgabe() einzeln, satzweise und nacheinander aufgelistet auf dem
* Bildschirm angezeigt.
*/
public void personenausgabe()
{
  for (int i = 0; i<personen.size(); i++)
  {
      System.out.println(i+1+"."+"Satz");
      System.out.println();
      System.out.println(personen.get(i).toString());
      Input.readString("Betätigen Sie bitte die <RETURN> - Taste um weiterzukommen\n");
  }
}


/**
* @param personen (ArrayList)
* Auslagerung der Informationen von Personobjekten in die
* Datei adreli.csv. FileWriter dient dazu, dass die
* entsprechenden Personendaten char-artig in die Datei adreli.csv
* geschrieben werden. Anhand der for-Schleife werden die
* einzelnen Attribute mittels BufferedWriter in die Datei
* geschrieben, jedoch getrennt und nicht hintereinander.
*/
public void sichern(ArrayList<Person> personen)
{
  try {

    BufferedWriter bw = new BufferedWriter(new FileWriter("adreli.csv"));


      for (Person p : personen)
      {

        bw.write(p.name + ";");
        bw.write(p.vorname + ";");
        bw.write(p.anrede + ";");
        bw.write(p.strasse + ";");
        bw.write(p.plz + ";");
        bw.write(p.ort + ";");
        bw.write(p.telefon + ";");
        bw.write(p.fax + ";");
        bw.write(p.bemerkung + ";" + "\n");
      }

      bw.close();

      System.out.println("Ihre Daten wurden in die Datei adreli.csv gespeichert!");

    }
  catch (IOException e)
    {
      System.out.println(e.getMessage());

    }
}


/**
* loescht Datei "adreli.csv" zusammen mit gespeicherten
* Personendaten von der Festplatte. Im try-Block wird versucht, die neu
* angelegte Datei adreli.csv von der Festplatte zu löschen. Falls es gelöscht
* wurde, soll auf dem Bildschrirm ausgegeben werden, dass die Datei adrelicsv
* erfolgreich gelöscht wurde. Im anderen Fall, falls es die Datei auf der Festplatte
* nicht gibt, soll eine Fehlermeldung ausgegeben werden, dass die Datei
* adreli.csv auf der Festplatte nicht vorhanden ist.
*/
public static void fileLoeschen()
{
    try {
    	File datei = new File("adreli.csv");
  
    	if(datei.exists())
    	{
    		datei.delete();
    		System.out.println("Die Datei " + "adreli.csv" + " wurde erfolgreich gelöscht.\n");
    	}
      else
      {
        System.out
        .println("Die Datei adreli.csv ist auf der Festplatte leider nicht vorhanden.\n");
      }
      }
    catch (Exception e)
    {
      System.out.println(e.getMessage());
    }
}


/**
* Mithilfe der Methode programmbeenden hat der Benutzer die Möglichkeit
* das Programm erfolgreich zu verlassen. System.exit(0); dient in dieser
* Methode dazu, damit der Benutzer das Programm vorzeitig beenden kann.
*/
public static void programmbeenden()
{
  System.exit(0);

}

}




Java:
import java.io.*;
import java.net.Socket;


/**
 * Die Klasse ControlerThread dient dazu, die Klasse ViewThread und die Klasse ModelThread
 * also die beiden Threads via Pipe miteinander zu verbinden und anschliessend zu starten.
 */
public class ControlerThread
{

/**
* @param args
* @throws ClassNotFoundException
* @throws IOException
* Die main-Methode dient dazu, die beiden Threads (ModelThread und ViewThread) über
* die Pipe zum Laufen zu bringen.
* Innerhalb der main-Methode werden als erstes PipedReader und PipedWriter erzeugt.
* Anschliessend werden PipedReader und PipedWriter miteinander verbunden.
* Im nächsten Schritt wird ein neues ViewThread t1 und ein neues ModelThread t2 erzeugt,
* der ViewThread t1 bekommt als Parameter pr2 und pw1 und der ModelThread t2
* bekommt als Parameterübergabe pr1 und pw2. Dann werden die neu erzeugten Threads
* anschliessend asynchron gestartet.
* pw1 also die Pipe1 schreibt vom ViewThread zum ModelThread 
* und pw2 also Pipe2 schreibt vom ModelThread zum ViewThread.
*/
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException
{

	String requestToServer;

	String ipadresse = Input.readString("Geben Sie bitte die IP-Adresse zum Verbinden ein: ");
	Socket clientSocket = new Socket(ipadresse, 45678);
	
	

    System.out.println("Verbindung zum Server mit der Adresse "
            + clientSocket.getInetAddress() + " wurde hergestellt.");
    
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
            clientSocket.getOutputStream()));
    
    BufferedReader in = new BufferedReader(new InputStreamReader(
            System.in));
    
      PipedReader pr1 = new PipedReader();
	  PipedWriter pw1 = new PipedWriter();

	  PipedReader pr2 = new PipedReader();
	  PipedWriter pw2 = new PipedWriter();
	  
	  PipedReader prControllerVonModel = new PipedReader();
	  PipedReader prControllerVonView = new PipedReader();
	  PipedWriter pwControllerZuModel = new PipedWriter();
	  PipedWriter pwControllerZuView = new PipedWriter();

	  pwControllerZuModel.connect(pr1);
	  pwControllerZuView.connect(pr2);
	  pw2.connect(prControllerVonModel);
	  pw1.connect(prControllerVonView);
	 
	  ViewThread t1 = new ViewThread(pr2, pw1);
	  ModelThread t2 = new ModelThread(pr1, pw2);

	  t1.start(); //asynchroner Start
	  t2.start(); // asynchroner Start
    
	  int a;
	  
	  while (true)
	  {
		  try
		  {
        a = prControllerVonView.read();
        requestToServer = "" + a;
        bw.write(requestToServer);
        bw.newLine();
        bw.flush();
        pwControllerZuModel.write(a);
        prControllerVonModel.read();
        pwControllerZuView.write(0);
       
		  }
   

	catch (Exception e)
	{
		e.printStackTrace();
		System.exit(1);
	}
    
 
  
  
  
  
  
  
}
}
}
 
T

träät

Gast
mal von abgesehen das du von 0:03 bis 0:26 sicher noch zeit gehabt hättest zu editieren ... also ein doppel-post unnötig gewesen wäre ... fehlt irgendwie immer noch die frage

was genau bedeutet : "jedoch funktioniert die Kommunikation zwischen Client und Server noch nicht so ganz richtig" ?
so ne aussage ist keien fehlerbeschreibung ...

was erwartest du was passiert ... was passiert stattdessen ... hast du debugging-infos ...

alles sowas was man eigentlich alleine in der lage sein sollte zu lösen ...


mal davon ab ... dein code ist auch nicht grad der beste ...
alleine in "Server" gehört der loop in einen Thread ...

also sowas

Java:
while(true)
{
	try
	{
		Socket client=serverSocket.accept();
		ClientRunnable clientRunnable=new ClientRunnable(server, client);
		(new Thread(clientRunnable)).start();
		clients.add(clientRunnable);
	}
	catch(Exception e)
	{
		System.out.println("failed to accept client");
		e.printStackTrace();
	}
}

dann die nächste frage : WARUM "@SuppressWarnings("resource")" ? ... sorry ... aber dafür sehe ich wirklich keinen grund ...

und warum arbeitest du mit Date und Calendar ? wenn du die zeit haben willst reicht "System.currentTimeMillis()"

zu deinem menü ... falls man das so nennen kann ...
nur weil du die StringBuilder.append() untereinander schreibst fehlen trotzdem die new-lines ... ansonsten steht alles in einer zeile ... ist sicher so nicht gewollt

auch macht die klasse ViewThread so überhaupt keinen sinn ...
wozu die pipe ? und was zur hölle ist "Input" für ne klasse ?

ich will gar nicht weiter lesen ... aber der code sieht ziemlich danach aus das du dich mit klaren strukturen noch nicht befasst hast ... und dann gleich n net-code drum schreiben sollte man lassen ... solche fehler setzen sich dann fest und sind später nur noch schwer wieder abzugewöhnen ...

du solltest villeicht nebenbei noch mal alles ansehen was du bis jetzt so gelernt hast ... denn irgendwo hast du irgendwas scheinbar noch nicht so ganz verstanden ...

und bitte gewöhne dir an fragen richtig zu stellen ... wie man das macht steht in den FAQ
 

ebruss17

Bekanntes Mitglied
danke dass du mir einen Beitrag geschrieben hast. Die Aufgabenstellung war laut dem Professor so erwünscht! Ich kann dir auch die Aufgabenstellung mitzusenden! Der Client schreibt dem Server zwar welchen Menüpunkt er in dem Fall von 1-5 gewählt hat und dieser protokolliert auch die einzelnen Aktivitäten vom Client in eine Logfile-Datei, jedoch gibt der Server dem Client nicht eine Antwort wie z.b. Okay oder nicht okay zurück, damit der Client weitermachen kann. In meinem Fall macht Client einfach weiter ohne eine Antwort vom Server ..... ich hoffe ich habe mich diesesmal deutlicher ausgedrückt ..... :(
 

bERt0r

Top Contributor
Hmmm MVC über die Konsole ist mir zumindest in der Art noch nie untergekommen. Warum muss deine View ein eigener Thread sein? Wird das wirklich so in der Angabe verlangt? Du machst da ein paar Dinge einfach sehr seltsam und kompliziert...
 

ebruss17

Bekanntes Mitglied
Aufgabenstellung:

Ein Thread kümmert sich um die Kommunikation mit dem User ViewThread

Ein zweiter Thread kümmert sich um die Lese-und Schreibvorgänge auf der Datenbasis ModelThread

Der datenaustausch und die KOmmunikation der beiden Threads (ModelThread und ViewThread) erfolgt mit Hilfe einer Pipe.

Der Hauptthread ist der ControlerThread

so war es laut dem Professor erwünscht und jetzt zu den Sockets......


zu den Sockets:

Ihre Software ist jetzt so zu strukturieren, dass Sie eine Client-Lösung und eine Server-Lösung haben. (Client und Server sind also 2 getrennte Applikationen.)

Im einfachsten Fall ist der Server single-threaded.
Im Idealfall(Ziel) ist Ihr Server multi-threaded, sodass für jeden Client, der sich bei Ihrem Server meldet, ein eigener Thread für die Bedienung eines Clients verfügbar ist. damit ist der Server ein Stück weit multi-user-fähig und skallierbar.

damit Client und Server im Netz testbar sind, sehen Sie die Möglichkeit vor, dem Client die IP-Adresse des Servers beim Start mitzugeben, bzw. der Client erkundigt sich nach der Server-IP.

Der Datenaustausch zwischen Client und Server erfolgt mit Hilfe von Sockets.

Der Server protokolliert seine Aktivitäten in Textform (ASCII) in einem Logfile(CSV-Datei). Entwerfen Sie dazu ein einfaches Logfileformat. Sie können auch die Klassen FileReader und FileWriter zur Bearbeitung der Textfiles nutzen.

So das war alles vom Professor verlangt hoffe Ihnen ist jetzt das ganze etwas deutlicher ....
 
Zuletzt bearbeitet:
T

trääät

Gast
ich kann dir jetzt leider so nicht direkt weiterhelfen ... da ich mich weder mit MVC noch damit auskenne wie man dies über mehrere VMs hinweg zum laufen bekommt ...

eine von wikipedia referenzierte YT-playlist dürfte aber zumindest teilweise helfen : Entwicklung verteilter Anwendungen (Sommersemester 2012) - YouTube
zumindest bin ich gerade dabei mir mit hilfe dieser videos MVC und verteilte systeme in java näher zu bringen ... und persönlich finde ich den dozenten mehr als nur spitze ... man versteht wirklich was ... und egal wer da "live" mit in der vorlesung saß ... wer bei dem nich mitkommt ist selbst schuld ... weil besser als er es macht geht es wirklich nicht ... von dieser sorte dozent bräuchten wir mal n paar

am anfang wird viel basic-krams geklärt und auf andere vorlesungen verwiesen .. aber glaub mir : wenn man halbwegs fit ist in java dann hat man keine probleme dem zu folgen ...

es werden sogar NIO / AIO und RMI angesprochen ...
 

bERt0r

Top Contributor
Also ich hab jetzt zumindest nicht die Stelle gefunden, wo der Client den "okay" Bestätigungsstring vom Server liest und ihn dann vergleicht. Vielleicht kannst du mal den Codeausschnitt rauspicken.
 

ebruss17

Bekanntes Mitglied
Also ich habe jetzt weiter an meinem Code gearbeitet..... Jetzt kommt das okay auch beim Client gott sei dank an.... und wenn es nicht okay ist halt ein (nicht okay) jedoch eine kurze Frage in meinem Beispiel werden die Daten, die über Sockets ausgetauscht werden als char oder bytes ausgetauscht?? Bitte um Hilfe.....

und noch etwas, wie kann ich meinen Server multithreaded machen, damit dieser mehrere Clients bedienen kann?
 
Zuletzt bearbeitet:

AndiE

Top Contributor
So richtig weiß ich noch nicht, wie das funktionieren soll.
Welche Threads laufen auf dem Server und welche auf dem Client? Ich habe nicht gesehen, dass du Datagramme zusammenbaust, die du vom Client zum Server schickst. Es sieht auch aus, als ob du auch sowas wie ein Protokoll implementieren willst.

Ich hätte ModelThread und ControllerThread auf den Server gelegt.
Der Client sendet an den ControlThread, und der ist im Server per Pipe mit dem ModelThread verbunden, weil der ja die Datenbankfunktion erfüllt(Einfügen, Löschen, Ändern,Anzeigen=>CRUD).
Auf dem Client läuft bie mir eine Anwendung ViewThread, die ich aber nicht von Thread ableiten würde, sondern als normale Klasse anlegen würde. In ihr läuft auch die Nutzerkommunikation, und sie sendet die Auswahl und gegebenenfalls die Eingabedaten unbearbeitet als Datagramm an den ControlerThread. Der sendet je nachdem Erfolgs-, Fehlermeldungen, oder Ergebnisse zurück, die in ViewThread angezeigt werden.
 
T

trääät

Gast
ohne unverschämt wirken zu wollen ... aber die antworten auf deine fragen werden in der von mir verlinkten video-serie gegeben ... die solltest du dir dann auch schon mal ansehen ...

btw : wie du deinen server multi-threaded für mehrere clienten machst habe ich oben schon angemerkt ...
 

AndiE

Top Contributor
Was hast du ausprobiert?- Schicke mal den Code.
Liefen die Compilierungen problemlos durch?
Wie hast du ausprobiert? Welche Meldungen kamen, was hat wie nicht funktioniert?
Was sagt der Step-by Step-Durchlauf? Zuerst Breakpoint setzen und dann langsam durchlaufen lassen und die Variablen beobachten.(Debuggen)

Die Frage, wie das System aus deiner Sicht funktionieren soll, steht immer noch unbeantwortet.

Manchmal soll es auch ein Firewall-Problem geben - sieh mal, ob der Port offen ist.
 

ebruss17

Bekanntes Mitglied
also ich habe es so ausprobiert dass was der träät gepostet hatte mit clientRunnable usw...
Ich habe es ausgeführt aber der Server kann immernoch nicht mehrere Clients bedienen. Ich kann zwar 2 Clients problemlos starten aber es muss zuerst ein Client beendet werden, damit der nächste mit seiner Auswahl weitermachen kann. :(
 
T

träät

Gast
ich hab den code nur aus nem chat-beispiel kopiert http://www.java-forum.org/allgemein...uebers-internet-verschicken-3.html#post965571 was ich mal vor längerer zeit für einen user im netz-forum geschreiben habe ...
und nicht nur chats lassen so bauen das mehrere clients gleichzeitig laufen sondern auch alles andere ...

ich vermute den deadlock eher bei der verareitung der daten das hier ein client den anderen ausbremst ...

oder du warst so intiligent und hast das accept() mit in den thread gepackt ... weil dann ist es wieder nur single-threaded ...
 

ebruss17

Bekanntes Mitglied
Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.ArrayList;
import java.util.Date;

/**
 * Die Klasse Controller des Servers bietet die Kommunikation des Clients mit
 * dem Server über den Socket 12345. Außderdem kontrolliert er die Pipe-
 * Kommunikation zwischen den Threads des Servers. Bei jeder Aktivität erstellt
 * der Controller einen neuen Eintrag im Log-File 'logfile.csv'mit Zeitstempel.
 * 
 */
public class Server {

    File serverdatei = new File("logfile.csv");
    private static ArrayList<String> eintragsliste = new ArrayList<String>();

    
    /**
     * Die Main kümmert sich um die Kommunikation des Servers mit dem Client via
     * Sockets und erstellt auch ein zu Beginn leeres Logfile. Außerdem regelt
     * sie den Datenverkehr der Threads des Servers. Hier wird ein Zeit- und
     * Datumsformat definiert, dass dann auf der Konsole zu den einzelnen
     * Aktionen angezeigt und im Logfile gespeichert wird.
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws Exception {
    	
        System.out.println(">>> Der Server wird gestartet");
        
        @SuppressWarnings("resource")
		ServerSocket myServerSocket = new ServerSocket(45678);

      
       
        while (true) {
        	
        	
            Socket myClientSocket = myServerSocket.accept();
           
            
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    myClientSocket.getInputStream()));

            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                    myClientSocket.getOutputStream()));

            Calendar cal = Calendar.getInstance();
            
            SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss ");
            System.out.println( formater.format(cal.getTime()) );
            
            Date currentTime = new Date();

            String anmeldung = formater.format(currentTime) + ";"
                    + "Angemeldet an lokaler Adresse" + ";"
                    + myClientSocket.getLocalAddress() + "\n";

            eintragsliste.add(anmeldung);

            schreibeLog(eintragsliste);

            System.out.println("--> Local Address angemeldet: "
                    + myClientSocket.getLocalAddress());
            
            String s;

            try {
                while ((s = br.readLine()) != null) 
                {
        
                    int a = Integer.parseInt(s);

                    if ((a < 6) && (a > 0)) {
                    	
                    	
                        formater = new SimpleDateFormat("HH:mm:ss ");
                        currentTime = new Date();
                        auswahl(a, currentTime);
                        schreibeLog(eintragsliste);

                        System.out.println("> " + formater.format(currentTime)
                                + "\n" + "Sie haben den Menuepunkt \'"
                                + a + "\' ausgewaehlt");

                        bw.write("Ihre Auswahl ist in Ordnung :-)");
                        bw.newLine();
                        bw.flush();
                    } else {
                        auswahl(a, currentTime);
                        schreibeLog(eintragsliste);
                        System.out.println("> " + formater.format(currentTime)
                                + "\n" + "Ungueltige Eingabe!");
                        bw.write("Ihre Auswahl ist leider nicht in Ordnung :-(");
                        bw.newLine();
                        bw.flush();
                       
                    }
                }
            }
            catch (Exception e) {
            	System.out.println(e.getMessage());
            }
            
            
            System.out.println("<-- LocalAddress: "
                    + myClientSocket.getLocalAddress());
            
            currentTime = new Date();
            
            String abmeldung = formater.format(currentTime) + ";"
                    + "Abgemeldet von der lokalen Adresse" + ";"
                    + myClientSocket.getLocalAddress() + "\n";
            
            eintragsliste.add(abmeldung);
            schreibeLog(eintragsliste);
            myClientSocket.close();
        }
    }
    
    
    /**
     * Diese Methode formatiert die Log-File Einträge und fügt diese dann durch
     * den Aufruf der Methode 'schreibeLog' dem Log-File 'logfile.csv' hinzu.
     *
     * @param a
     * @param zeit
     */
    public static void auswahl(int a, Date zeit) {
        StringBuilder gebeString = new StringBuilder();
        gebeString.append(zeit);
        gebeString.append(";");

        switch (a) {
            case 1:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("neue Person aufnehmen");
                gebeString.append(";");
                break;
            case 2:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("Records auflisten");
                gebeString.append(";");
                break;
            case 3:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("Records in eine Datei sichern");
                gebeString.append(";");
                break;
            case 4:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("Datei löschen");
                gebeString.append(";");
                break;
            default:
                break;
        }

        gebeString.append("\n");

        eintragsliste.add(gebeString.toString());
    }

   
    /**
     * Diese Methode schreibt die Einträge in die serverdatei "logfile.csv".
     */
    public static void schreibeLog(ArrayList<String> eintragsliste) {
        try {
       
            BufferedWriter bw = new BufferedWriter(new FileWriter("logfile.csv"));

            for (int i = 0; i < eintragsliste.size(); i++) {
                bw.write(eintragsliste.get(i));
            }

            bw.close();
           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    
}
Java:
import java.io.*;

import java.util.*;

public class ModelThread extends Thread
{

  File csvdatei = new File("adreli.csv");


  public static ArrayList<Person> personen = new ArrayList<Person>();

  
  private PipedReader reader;
  private PipedWriter writer;
  

/**
* Konstruktor mit 2 Parametern.
* @param reader
* @param writer
*/
public ModelThread(PipedReader reader, PipedWriter writer)
{

  super("ModelThread");
  this.reader = reader;
  this.writer = writer;
}


/**
* Die Klasse ModelThread wird über die sogenannte Pipe mithilfe dieser Methode zum Laufen gebracht.
* Falls die Eingaben aus der ViewThread-Klasse gelesen wurden, kann somit jetzt die jeweilige Methode
* ausgeführt werden. Der Thread der Benutzerseite wird gestartet.
* int a = reader.read(); liest von der Pipe, welcher Casefall eingegeben wurde.
* Mithilfe der Methode-write wird an das Hauptmenü ein Signal übergeben.
* Der Programmlauf wird in diesem Fall an die ViewThread-Klasse übergeben.
* Sobald die Eingabe aus der Klasse ViewThread gelesen ist, wird die jeweilige
* Methode der Klasse ModelThread ausgeführt.
*/
public void run()
{
  while (true)
  {

    try
    {
      int a = reader.read(); // es liest von der Pipe, welcher casefall eingegeben worden ist.
        switch (a)
        {

        case 1: // eine neue Person aufnehmen

          personeneingabe();
          break;

        case 2: // Records auflisten
          personenausgabe();
          break;

        case 3: // Records in eine Datei sichern
          sichern(personen);
          break;

        case 4: // Datei löschen
          fileLoeschen();
          break;

        case 5: // das Programm verlassen
          programmbeenden();
          break;

        default: // Falsche Zahl eingegeben
          System.out
          .println("\nSie haben keine gültige Zahl eingegeben, bitte geben Sie eine Zahl von 1 - 5 ein!");
        }

        writer.write(a);
      }
      catch (IOException io)
      {
        System.out.println("Es ist ein Fehler im ModelThread aufgetreten:" + "\n" + io.getMessage());
      }
  }
}


/**
* 2. while-Schleife fragt ab, ob Eingaben korrekt sind. Wenn die Eingaben korrekt sind,
* werden die Personenobjekte mit dem Befehl personen.add(p) in die ArrayList personen eingetragen.
*/
public void eingabenkorrektheit()
{
  boolean beenden = false;
    while (!beenden)
    {
      System.out.println();
      System.out.println("Geben Sie bitte Ihre Daten ein: ");
    System.out.println();
    Person p = new Person();
    p.readPerson();

     while (!beenden)
     {
               String antwort =Input.readString(
                        "Sind Ihre Eingaben korrekt?\n(J/j = Ja, N/n = Nein)");

               if (antwort.equals("J") || antwort.equals("j"))
                {
                  beenden = true;

                }
                else if (antwort.equals("N") || antwort.equals("n"))
                {
                  p.readPerson();
                    beenden = false;
                }
                else
                {
                    System.out.println(
                        "Ihre Eingabe ist nicht gültig, bitte nochmals versuchen!\n");
                    beenden = false;
                }

    }
            personen.add(p);

            String antwort = Input.readString(
                "Möchten Sie noch weitere Personendaten aufnehmen?\n(J/j = Ja, N/n = Nein)",
          "[jJnN]",
          "Ihre Eingabe war leider fehlerhaft, bitte versuchen Sie es erneut!");

            if (antwort.equals("J") || antwort.equals("j"))
            {
                beenden = false;
            }
            else if (antwort.equals("N") || antwort.equals("n"))
            {
                beenden = true;
            }
            else
            {
                System.out.println("Sie haben eine ungültige Eingabe betätigt, bitte erneut versuchen!\n");
                beenden = false;
            }
     }
}


/**
 * diese Methode ruft die Methode eingabenkorrektheit() auf, um abfragen zu können,
 * ob die eingegebenen Personeninformationen korrekt sind oder nicht.
 * Und ob der Benutzer noch weitere Personendaten aufnehmen möchte.
 *
 */
public void personeneingabe()
{
  eingabenkorrektheit();
}


/**
* Die Personeninformationen, die im ArrayList personen gespeichert wurden, werden mithilfe
* der Methode personenausgabe() einzeln, satzweise und nacheinander aufgelistet auf dem
* Bildschirm angezeigt.
*/
public void personenausgabe()
{
  for (int i = 0; i<personen.size(); i++)
  {
	  System.out.println("");
      System.out.println(i+1+"."+"Satz");
      System.out.println();
      System.out.println(personen.get(i).toString());
      Input.readString("Betätigen Sie bitte die <RETURN> - Taste um weiterzukommen\n");
  }
}


/**
* @param personen (ArrayList)
* Auslagerung der Informationen von Personobjekten in die
* Datei adreli.csv. FileWriter dient dazu, dass die
* entsprechenden Personendaten char-artig in die Datei adreli.csv
* geschrieben werden. Anhand der for-Schleife werden die
* einzelnen Attribute mittels BufferedWriter in die Datei
* geschrieben, jedoch getrennt und nicht hintereinander.
*/
public void sichern(ArrayList<Person> personen)
{
  try {

	  System.out.println("");
    BufferedWriter bw = new BufferedWriter(new FileWriter("adreli.csv"));


      for (Person p : personen)
      {

        bw.write(p.name + ";");
        bw.write(p.vorname + ";");
        bw.write(p.anrede + ";");
        bw.write(p.strasse + ";");
        bw.write(p.plz + ";");
        bw.write(p.ort + ";");
        bw.write(p.telefon + ";");
        bw.write(p.fax + ";");
        bw.write(p.bemerkung + ";" + "\n");
      }

      bw.close();

      System.out.println("Ihre Daten wurden in die Datei adreli.csv gespeichert!");

    }
  catch (IOException e)
    {
      System.out.println(e.getMessage());

    }
}


/**
* loescht Datei "adreli.csv" zusammen mit gespeicherten
* Personendaten von der Festplatte. Im try-Block wird versucht, die neu
* angelegte Datei adreli.csv von der Festplatte zu löschen. Falls es gelöscht
* wurde, soll auf dem Bildschrirm ausgegeben werden, dass die Datei adrelicsv
* erfolgreich gelöscht wurde. Im anderen Fall, falls es die Datei auf der Festplatte
* nicht gibt, soll eine Fehlermeldung ausgegeben werden, dass die Datei
* adreli.csv auf der Festplatte nicht vorhanden ist.
*/
public static void fileLoeschen()
{
    try {
    	System.out.println("");
    	File datei = new File("adreli.csv");
  
    	if(datei.exists())
    	{
    		datei.delete();
    		System.out.println("Die Datei " + "adreli.csv" + " wurde erfolgreich gelöscht.\n");
    	}
      else
      {
        System.out
        .println("Die Datei adreli.csv ist auf der Festplatte leider nicht vorhanden.\n");
      }
      }
    catch (Exception e)
    {
      System.out.println(e.getMessage());
    }
}


/**
* Mithilfe der Methode programmbeenden hat der Benutzer die Möglichkeit
* das Programm erfolgreich zu verlassen. System.exit(0); dient in dieser
* Methode dazu, damit der Benutzer das Programm vorzeitig beenden kann.
*/
public static void programmbeenden()
{
  System.exit(0);

}

}


Java:
import java.io.Serializable;


/**
 *  Mithilfe der Klasse "Person" werden Daten über Personen erfasst
 */
public class Person implements Serializable  
{

	public String name;
	public String vorname;
	public String anrede;
	public String strasse;
	public String plz;
	public String ort;
	public String telefon;
	public String fax;
	public String bemerkung;


	static final long serialVersionUID = 0L;



/**
* überprüft den eingegebenen Namen mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
public void read_in_Name()
{
	System.out.println("(z.B. Musterfrau)");
	name = Input.readString("Name: ","([A-ZÖÜ][a-zöü]+)",
			"\nGeben Sie Ihren Namen bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft den eingegebenen Vorname mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Vorname()
{
	System.out.println("(z.B. Maria)");
	System.out.println("(z.B. Ana-Marie)");
	vorname = Input.readString("Vorname: ",
			"([A-ZÖÜ][a-zöü]+)|([A-ZÖÜ][a-zöü]+[-][A-ZÖÜ][a-zöü]+)",
			"\nGeben Sie Ihren Vornamen bitte nach dem Muster des angezeigten Beispiels ein! ");
}


/**
* überprüft die eingegebene Anrede mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Anrede()
{
	System.out.println("(z.B. Frau oder Herr)");
	anrede = Input.readString("Anrede: ","(Herr|Frau)",
			"Diese Anrede wird leider nicht akzeptiert, bitte geben Sie Herr oder Frau ein!  ");
}


/**
* überprüft die eingegebene Strasse mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Strasse()
{
	System.out.println("(z.B. Musterstrasse 1)");
	System.out.println("(oder Unterer Hofweg 1)");
	strasse = Input.readString("Strasse: ",
			"([A-ZÖÜ][a-zöüß]+[/ ][0-9]+)|([A-ZÖÜ][a-zöüß]+[/ ][A-ZÖÜ][a-zöüß]+[/ ][0-9]+)",
			"\nGeben Sie Ihre Strasse bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Postleitzahl mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Plz()
{
	System.out.println("(z.B. D-12345)");
	plz = Input.readString("PLZ: ", "[A-Z]+[-][0-9]{1,5}",
		"\nGeben Sie Ihre PLZ bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft den eingegebenen Ort mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Ort()
{
	System.out.println("(z.B. Musterort)");
	ort = Input.readString("Ort: ", "([A-Z][a-z]+)|([A-ZÖÜ][a-zöü]+)",
		"\nGeben Sie Ihren Ort bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Telefonnummer mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Telefon()
{
	System.out.println("(z.B. +49 12345-12345");
	System.out.println("(z.B. 12345-12345");
	telefon = Input.readString("Telefon: ", "([/+][0-9]{2}[/ ])?[0-9]+[/-][0-9]+",
			"\nGeben Sie Ihre Telefonnummer bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Faxnummer mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Fax()
{
	System.out.println("(z.B. +49 12345-12345)");
	System.out.println("(oder 12345-12345");
	fax = Input.readString("Fax: ", "([/+][0-9]{2}[/ ])?[0-9]+[/-][0-9]+",
		"\nGeben Sie Ihre Faxnummer bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Bemerkung mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Bemerkung()
{
	System.out.println("Sie muessen nichts eingeben!");
	bemerkung = Input.readString("Bemerkung: ");
}


/**
*  Sammlung von Methoden
*/
public Person readPerson()
{
	read_in_Name();
	read_in_Vorname();
	read_in_Anrede();
	read_in_Strasse();
	read_in_Plz();
	read_in_Ort();
	read_in_Telefon();
	read_in_Fax();
	read_in_Bemerkung();

	return null;
}


/**
*  Ueberschriebene toString-Methode zur angepassten Ausgabe von Personenobjekten.
*/
public String toString() 
{
		String out = "Name: " + name + "\nVorname: " + vorname
				+ "\nAnrede: " + anrede + "\nStrasse: " + strasse + "\nPLZ: "
				+ plz + "\nOrt: " + ort + "\nTelefon: " + telefon + "\nFax:"
				+ fax + "\nBemerkung: " + bemerkung;
		return out;
}

}


Java:
import java.io.*;
import java.net.Socket;


/**
 * Die Klasse ControlerThread dient dazu, die Klasse ViewThread und die Klasse ModelThread
 * also die beiden Threads via Pipe miteinander zu verbinden und anschliessend zu starten.
 */
public class ControlerThread extends Thread
{

/**
* @param args
* @throws ClassNotFoundException
* @throws IOException
* Die main-Methode dient dazu, die beiden Threads (ModelThread und ViewThread) über
* die Pipe zum Laufen zu bringen.
* Innerhalb der main-Methode werden als erstes PipedReader und PipedWriter erzeugt.
* Anschliessend werden PipedReader und PipedWriter miteinander verbunden.
* Im nächsten Schritt wird ein neues ViewThread t1 und ein neues ModelThread t2 erzeugt,
* der ViewThread t1 bekommt als Parameter pr2 und pw1 und der ModelThread t2
* bekommt als Parameterübergabe pr1 und pw2. Dann werden die neu erzeugten Threads
* anschliessend asynchron gestartet.
* pw1 also die Pipe1 schreibt vom ViewThread zum ModelThread 
* und pw2 also Pipe2 schreibt vom ModelThread zum ViewThread.
*/
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException
{

	String requestToServer;

	String ipadresse = Input.readString("Geben Sie bitte die IP-Adresse zum Verbinden ein: ");
	Socket clientSocket = new Socket(ipadresse, 45678);

	
	

    System.out.println("Verbindung zum Server mit der Adresse "
            + clientSocket.getInetAddress() + " wurde hergestellt.");
    
      PipedReader pr1 = new PipedReader();
	  PipedWriter pw1 = new PipedWriter();

	  PipedReader pr2 = new PipedReader();
	  PipedWriter pw2 = new PipedWriter();
	  
	  PipedReader prControllerVonModel = new PipedReader();
	  PipedReader prControllerVonView = new PipedReader();
	  PipedWriter pwControllerZuModel = new PipedWriter();
	  PipedWriter pwControllerZuView = new PipedWriter();

	  pwControllerZuModel.connect(pr1);
	  pwControllerZuView.connect(pr2);
	  pw2.connect(prControllerVonModel);
	  pw1.connect(prControllerVonView);
	 
	  
	  ViewThread t1 = new ViewThread(pr2, pw1);
	  ModelThread t2 = new ModelThread(pr1, pw2);

	  
	  t1.start(); // asynchroner Start
	  t2.start(); // asynchroner Start
    
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
            clientSocket.getOutputStream()));
    
  //Antwort vom Server
    BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    
    
   int a;
   
   while (true) {

       try {
    	   
    	
	 
    a = prControllerVonView.read();
    requestToServer = "" + a;
    bw.write(requestToServer);
    bw.newLine();
    bw.flush(); // ohne flush würde requestToServer beim BufferedWriter drinnen bleiben und nicht an OutputStreamWriter weitergegeben werden, und der bw würde sagen es lohnt sich nicht weiter zu geben , es würde erhalten bleiben
    
    
    String answer = br.readLine(); // blockiert bis ganze Zeile vom Server empfangen wurde.

	System.out.println(answer); // Antwort zurück und ausgegeben
	   
    pwControllerZuModel.write(a);
    prControllerVonModel.read();
    pwControllerZuView.write(0);
   
  

    
       }
       catch (Exception e)
       {
    	   e.printStackTrace();
           System.exit(1);
       }
      
    
	 
}
}
}


Java:
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;

/**
 * Die Klasse ViewThread gibt das Hauptmenü aus. Das Hauptmenü wird 
 * anschliessend per Socket an den Server geschickt.
 * Über Pipes findet die Kommunikation zwischen ControlerThread und
 * ViewThread statt.
 */
public class ViewThread extends Thread
{


  private  PipedReader reader;
  private  PipedWriter writer;
  

/**
* @param reader
* @param writer 
* Der Konstruktor ViewThread mit 2 Parameterübergaben (PipedReader und PipedWriter). 
* PipedReader reader ist dazu da, um die Eingaben aus einem beliebigen Reader zu lesen.
* PipedWriter writer ist dazu da, um die Ausgabe in einen beliebigen Writer zu schreiben.
*/
public ViewThread(PipedReader reader, PipedWriter writer)
{
  super("ViewThread");
  this.reader = reader;
  this.writer = writer;
}

  

/**
 * Diese überschriebene run-Methode der Thread-Klasse ruft
 * die Methode hauptmenu auf und führt diese anschliessend aus.
 */
public void run()
{
  hauptmenu();

}


/**
* Das Hauptmenü wird auf der Konsole angezeigt.
* Innerhalb des try-Blocks findet die Kommunikation der Pipes statt.
* Es werden die Eingaben an die Klasse ModelThread über das Objekt
* PipedWriter geschickt. 
* Anschliessend wird aus der Klasse ModelThread über das Objekt  
* PipedReader gelesen.
*/
public void hauptmenu()
{
	while(true)
  {
    System.out.println("\r===========================");
    System.out.println(" ADRELI - Adressverwaltung ");
    System.out.println("===========================");
    System.out.println();
    System.out.println("Wollen Sie...");
    System.out.println();

    //BILDSCHIRMMENUE
    System.out.println("   eine neue Person aufnehmen: > 1");
    System.out.println("            Records auflisten: > 2");
    System.out.println("Records in eine Datei sichern: > 3");
    System.out.println("                Datei löschen: > 4");
    System.out.println("       das Programm verlassen: > 5");

    int a = Input.readInt();
    System.out.println("------------------------------------");
    System.out.println();

    if (a == 5) {
        System.out.println("\n" + "\n" + "Sie haben das Programm erfolgreich verlassen.");
        System.exit(1);
    } else {
    try
    {
     writer.write(a);
     reader.read();
    }
    catch(IOException io)
    {
      System.out.println("Fehler in ViewThread:" + "\n" +  io.getMessage());
    }
  }
}

}
}
 

ebruss17

Bekanntes Mitglied
Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.ArrayList;
import java.util.Date;

/**
 * Die Klasse Controller des Servers bietet die Kommunikation des Clients mit
 * dem Server über den Socket 12345. Außderdem kontrolliert er die Pipe-
 * Kommunikation zwischen den Threads des Servers. Bei jeder Aktivität erstellt
 * der Controller einen neuen Eintrag im Log-File 'logfile.csv'mit Zeitstempel.
 * 
 */
public class Server {

    File serverdatei = new File("logfile.csv");
    private static ArrayList<String> eintragsliste = new ArrayList<String>();

    
    /**
     * Die Main kümmert sich um die Kommunikation des Servers mit dem Client via
     * Sockets und erstellt auch ein zu Beginn leeres Logfile. Außerdem regelt
     * sie den Datenverkehr der Threads des Servers. Hier wird ein Zeit- und
     * Datumsformat definiert, dass dann auf der Konsole zu den einzelnen
     * Aktionen angezeigt und im Logfile gespeichert wird.
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws Exception {
    	
        System.out.println(">>> Der Server wird gestartet");
        
        @SuppressWarnings("resource")
		ServerSocket myServerSocket = new ServerSocket(45678);

      
       
        while (true) {
        	
        	
            Socket myClientSocket = myServerSocket.accept();
           
            
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    myClientSocket.getInputStream()));

            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                    myClientSocket.getOutputStream()));

            Calendar cal = Calendar.getInstance();
            
            SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss ");
            System.out.println( formater.format(cal.getTime()) );
            
            Date currentTime = new Date();

            String anmeldung = formater.format(currentTime) + ";"
                    + "Angemeldet an lokaler Adresse" + ";"
                    + myClientSocket.getLocalAddress() + "\n";

            eintragsliste.add(anmeldung);

            schreibeLog(eintragsliste);

            System.out.println("--> Local Address angemeldet: "
                    + myClientSocket.getLocalAddress());
            
            String s;

            try {
                while ((s = br.readLine()) != null) 
                {
        
                    int a = Integer.parseInt(s);

                    if ((a < 6) && (a > 0)) {
                    	
                    	
                        formater = new SimpleDateFormat("HH:mm:ss ");
                        currentTime = new Date();
                        auswahl(a, currentTime);
                        schreibeLog(eintragsliste);

                        System.out.println("> " + formater.format(currentTime)
                                + "\n" + "Sie haben den Menuepunkt \'"
                                + a + "\' ausgewaehlt");

                        bw.write("Ihre Auswahl ist in Ordnung :-)");
                        bw.newLine();
                        bw.flush();
                    } else {
                        auswahl(a, currentTime);
                        schreibeLog(eintragsliste);
                        System.out.println("> " + formater.format(currentTime)
                                + "\n" + "Ungueltige Eingabe!");
                        bw.write("Ihre Auswahl ist leider nicht in Ordnung :-(");
                        bw.newLine();
                        bw.flush();
                       
                    }
                }
            }
            catch (Exception e) {
            	System.out.println(e.getMessage());
            }
            
            
            System.out.println("<-- LocalAddress: "
                    + myClientSocket.getLocalAddress());
            
            currentTime = new Date();
            
            String abmeldung = formater.format(currentTime) + ";"
                    + "Abgemeldet von der lokalen Adresse" + ";"
                    + myClientSocket.getLocalAddress() + "\n";
            
            eintragsliste.add(abmeldung);
            schreibeLog(eintragsliste);
            myClientSocket.close();
        }
    }
    
    
    /**
     * Diese Methode formatiert die Log-File Einträge und fügt diese dann durch
     * den Aufruf der Methode 'schreibeLog' dem Log-File 'logfile.csv' hinzu.
     *
     * @param a
     * @param zeit
     */
    public static void auswahl(int a, Date zeit) {
        StringBuilder gebeString = new StringBuilder();
        gebeString.append(zeit);
        gebeString.append(";");

        switch (a) {
            case 1:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("neue Person aufnehmen");
                gebeString.append(";");
                break;
            case 2:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("Records auflisten");
                gebeString.append(";");
                break;
            case 3:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("Records in eine Datei sichern");
                gebeString.append(";");
                break;
            case 4:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("Datei löschen");
                gebeString.append(";");
                break;
            default:
                break;
        }

        gebeString.append("\n");

        eintragsliste.add(gebeString.toString());
    }

   
    /**
     * Diese Methode schreibt die Einträge in die serverdatei "logfile.csv".
     */
    public static void schreibeLog(ArrayList<String> eintragsliste) {
        try {
       
            BufferedWriter bw = new BufferedWriter(new FileWriter("logfile.csv"));

            for (int i = 0; i < eintragsliste.size(); i++) {
                bw.write(eintragsliste.get(i));
            }

            bw.close();
           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    
}


es sollte wenn dann im Server der Thread eingefügt werden damit er mehrere Clients bedienen kann aber WIE :(
 
Zuletzt bearbeitet:

AndiE

Top Contributor
Ich dachte, du testest die in den Videos angegebenen Beispiele.
Das ist ein multthreadfähiges Server-Client-Beispiel aus dem Internet:

-Client-
Java:
import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) {
	
	String hostname = "localhost";
	int port = 6789;

	// declaration section:
	// clientSocket: our client socket
	// os: output stream
	// is: input stream
	
        Socket clientSocket = null;  
        DataOutputStream os = null;
        BufferedReader is = null;
	
	// Initialization section:
	// Try to open a socket on the given port
	// Try to open input and output streams
	
        try {
            clientSocket = new Socket(hostname, port);
            os = new DataOutputStream(clientSocket.getOutputStream());
            is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: " + hostname);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: " + hostname);
        }
	
	// If everything has been initialized then we want to write some data
	// to the socket we have opened a connection to on the given port
	
	if (clientSocket == null || os == null || is == null) {
	    System.err.println( "Something is wrong. One variable is null." );
	    return;
	}

	try {
	    while ( true ) {
		System.out.print( "Enter an integer (0 to stop connection, -1 to stop server): " );
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String keyboardInput = br.readLine();
		os.writeBytes( keyboardInput + "\n" );

		int n = Integer.parseInt( keyboardInput );
		if ( n == 0 || n == -1 ) {
		    break;
		}
		
		String responseLine = is.readLine();
		System.out.println("Server returns its square as: " + responseLine);
	    }
	    
	    // clean up:
	    // close the output stream
	    // close the input stream
	    // close the socket
	    
	    os.close();
	    is.close();
	    clientSocket.close();   
	} catch (UnknownHostException e) {
	    System.err.println("Trying to connect to unknown host: " + e);
	} catch (IOException e) {
	    System.err.println("IOException:  " + e);
	}
    }           
}

-Server-
Java:
import java.io.*;
import java.net.*;

public class Server2 {
    public static void main(String args[]) {
	int port = 6789;
	Server2 server = new Server2( port );
	server.startServer();
    }

    // declare a server socket and a client socket for the server;
    // declare the number of connections

    ServerSocket echoServer = null;
    Socket clientSocket = null;
    int numConnections = 0;
    int port;
	
    public Server2( int port ) {
	this.port = port;
    }

    public void stopServer() {
	System.out.println( "Server cleaning up." );
	System.exit(0);
    }

    public void startServer() {
	// Try to open a server socket on the given port
	// Note that we can't choose a port less than 1024 if we are not
	// privileged users (root)
	
        try {
	    echoServer = new ServerSocket(port);
        }
        catch (IOException e) {
	    System.out.println(e);
        }   
	
	System.out.println( "Server is started and is waiting for connections." );
	System.out.println( "With multi-threading, multiple connections are allowed." );
	System.out.println( "Any client can send -1 to stop the server." );

	// Whenever a connection is received, start a new thread to process the connection
	// and wait for the next connection.
	
	while ( true ) {
	    try {
		clientSocket = echoServer.accept();
		numConnections ++;
		Server2Connection oneconnection = new Server2Connection(clientSocket, numConnections, this);
		new Thread(oneconnection).start();
	    }   
	    catch (IOException e) {
		System.out.println(e);
	    }
	}
    }
}

class Server2Connection implements Runnable {
    BufferedReader is;
    PrintStream os;
    Socket clientSocket;
    int id;
    Server2 server;

    public Server2Connection(Socket clientSocket, int id, Server2 server) {
	this.clientSocket = clientSocket;
	this.id = id;
	this.server = server;
	System.out.println( "Connection " + id + " established with: " + clientSocket );
	try {
	    is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
	    os = new PrintStream(clientSocket.getOutputStream());
	} catch (IOException e) {
	    System.out.println(e);
	}
    }

    public void run() {
        String line;
	try {
	    boolean serverStop = false;

            while (true) {
                line = is.readLine();
		System.out.println( "Received " + line + " from Connection " + id + "." );
                int n = Integer.parseInt(line);
		if ( n == -1 ) {
		    serverStop = true;
		    break;
		}
		if ( n == 0 ) break;
                os.println("" + n*n ); 
            }

	    System.out.println( "Connection " + id + " closed." );
            is.close();
            os.close();
            clientSocket.close();

	    if ( serverStop ) server.stopServer();
	} catch (IOException e) {
	    System.out.println(e);
	}
    }
}

Teste das mal- Läuft das bei dir?
 

AndiE

Top Contributor
Was passiert in meinem Beispiel? Es gibt eine Server-Klasse und es gibt eine Server2Connection-Klasse. Im Falle, dass der Server angesprochen wird, wird ein Thread für die Connection zwischen Server und aufrufendem Client erzeugt. In deinem Code wäre das etwas bei Zeile 51 der Server-Klasse. Doch da werden die anderen Threads nicht mit eingebunden.
auf dem Server nimmst du die Auswahl an, testest die, und sendest das Ergebnis zurück. also single-threaded.
 
T

tröööt

Gast
@tO
sorry ... aber wenn du dir nicht mal beispiele ansiehst und daher natürlich auch nichts umsetzt ... selbst schuld ...

um es dir mal zu demonstrieren

das hier ist jetzt nur mal deine main-methode
Java:
public static void main(String[] args) throws Exception {
        
        System.out.println(">>> Der Server wird gestartet");
        
        @SuppressWarnings("resource")
        ServerSocket myServerSocket = new ServerSocket(45678);
 
      
       
        while (true) {
            
            
            Socket myClientSocket = myServerSocket.accept();
           
            
            BufferedReader br = new BufferedReader(new InputStreamReader(
                    myClientSocket.getInputStream()));
 
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                    myClientSocket.getOutputStream()));
 
            Calendar cal = Calendar.getInstance();
            
            SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss ");
            System.out.println( formater.format(cal.getTime()) );
            
            Date currentTime = new Date();
 
            String anmeldung = formater.format(currentTime) + ";"
                    + "Angemeldet an lokaler Adresse" + ";"
                    + myClientSocket.getLocalAddress() + "\n";
 
            eintragsliste.add(anmeldung);
 
            schreibeLog(eintragsliste);
 
            System.out.println("--> Local Address angemeldet: "
                    + myClientSocket.getLocalAddress());
            
            String s;
 
            try {
                while ((s = br.readLine()) != null) 
                {
        
                    int a = Integer.parseInt(s);
 
                    if ((a < 6) && (a > 0)) {
                        
                        
                        formater = new SimpleDateFormat("HH:mm:ss ");
                        currentTime = new Date();
                        auswahl(a, currentTime);
                        schreibeLog(eintragsliste);
 
                        System.out.println("> " + formater.format(currentTime)
                                + "\n" + "Sie haben den Menuepunkt \'"
                                + a + "\' ausgewaehlt");
 
                        bw.write("Ihre Auswahl ist in Ordnung :-)");
                        bw.newLine();
                        bw.flush();
                    } else {
                        auswahl(a, currentTime);
                        schreibeLog(eintragsliste);
                        System.out.println("> " + formater.format(currentTime)
                                + "\n" + "Ungueltige Eingabe!");
                        bw.write("Ihre Auswahl ist leider nicht in Ordnung :-(");
                        bw.newLine();
                        bw.flush();
                       
                    }
                }
            }
            catch (Exception e) {
                System.out.println(e.getMessage());
            }
            
            
            System.out.println("<-- LocalAddress: "
                    + myClientSocket.getLocalAddress());
            
            currentTime = new Date();
            
            String abmeldung = formater.format(currentTime) + ";"
                    + "Abgemeldet von der lokalen Adresse" + ";"
                    + myClientSocket.getLocalAddress() + "\n";
            
            eintragsliste.add(abmeldung);
            schreibeLog(eintragsliste);
            myClientSocket.close();
        }
    }

und erlich : ich erkenne hier überhaupt keinen multi-thread ansatz ... weder wie ich ihn direkt gepostet habe noch wie er in anderen quellen genannt wird ...

korrekterweise müsste es wie folge aussehen

Java:
public static void main(String[] args) throws Exception
{
	System.out.println(">>> Der Server wird gestartet");
	ServerSocket myServerSocket = new ServerSocket(45678);
	while(true)
	{
		Socket myClientSocket=myServerSocket.accept();
		(new Thread(new Runnable()
		{
			public void run()
			{
				BufferedReader br=new BufferedReader(new InputStreamReader(myClientSocket.getInputStream()));
				BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(myClientSocket.getOutputStream()));
				Calendar cal=Calendar.getInstance();
				SimpleDateFormat formater=new SimpleDateFormat("HH:mm:ss ");
				System.out.println(formater.format(cal.getTime()));
				Date currentTime=new Date();
				String anmeldung=formater.format(currentTime)+";"+"Angemeldet an lokaler Adresse"+";"+myClientSocket.getLocalAddress()+"\n";
				eintragsliste.add(anmeldung);
				schreibeLog(eintragsliste);
				System.out.println("--> Local Address angemeldet: "+myClientSocket.getLocalAddress());
				String s;
				try
				{
					while((s=br.readLine())!=null)
					{
						int a=Integer.parseInt(s);
						if((a<6)&&(a>0))
						{
							formater=new SimpleDateFormat("HH:mm:ss ");
							currentTime=new Date();
							auswahl(a, currentTime);
							schreibeLog(eintragsliste);
							System.out.println("> " + formater.format(currentTime)+"\n"+"Sie haben den Menuepunkt \'"+a+"\' ausgewaehlt");
							bw.write("Ihre Auswahl ist in Ordnung :-)");
							bw.newLine();
							bw.flush();
						}
						else
						{
							auswahl(a, currentTime);
							schreibeLog(eintragsliste);
							System.out.println("> " + formater.format(currentTime)+"\n"+"Ungueltige Eingabe!");
							bw.write("Ihre Auswahl ist leider nicht in Ordnung :-(");
							bw.newLine();
							bw.flush();
						}
					}
				}
				catch(Exception e)
				{
					System.out.println(e.getMessage());
				}
				System.out.println("<-- LocalAddress: "+myClientSocket.getLocalAddress());
				currentTime=new Date();
				String abmeldung=formater.format(currentTime)+";"+"Abgemeldet von der lokalen Adresse"+";"+myClientSocket.getLocalAddress()+"\n";
				eintragsliste.add(abmeldung);
				schreibeLog(eintragsliste);
				myClientSocket.close();
			}
		})).start();
	}
}
mal anständig formatiert und die kilometer an leerzeilen rausgeworfen ...

multi-threaded bedeutet das für JEDEN clienten EIN EXTRA THREAD erzeugt wird ...
ob man dies nun so quick'n'dirty macht wie ich hier mit nem inline-runnable oder sowas sauber in eine eigene klasse auslagert ist jedem selbst überlassen ...

fakto : so lange du nicht ALLES innerhalb des while(true)-loops nach dem ServerSocket.accept() kommt in einen eigenen thread auslagerst wirst du nie ein multi-threaded server erhalten da du nach der annahme eines clienten immer auf dessen abarbeitung warten musst bevor du den nächsten annehmen kannst ...

das ist der sinn hinter paralleler programmierung ... was denke ich mal teil der aufgabenstellung sein dürfte
 

ebruss17

Bekanntes Mitglied
vielen Dank für deine Bemühungen aber jetzt kommt bei mir ein Fehler beim myClientSocket und zwar dieser Fehler:


Cannot refer to a non-final variable myClientSocket inside an inner class defined in a different method
 
T

trääät

Gast
ist ja auch soweit richtig ... aber liese sich einfach lösen ...
WIE genau bleibt dir überlassen ... ich würde aber zu ner eigenen klasse raten anstatt in zeile 7 einfach "final" davor zu schreiben ...

btw : du kannst nicht mal einen so einfachen fehler selbst lösen ... und dich dann auf das gebiet multi-threaded networking begeben ... viel spaß ... compiler-fehler lassen grüßen ...
 

ebruss17

Bekanntes Mitglied
Liebe Leute,

ich sitze seit 3 Tagen an diesem Programm und versuche, dass der Server mehrere Clients annehmen kann geht nun aber leider nicht :( Ich komme irgendwie nicht mehr weiter und bin wirklich sehr verwirrt es wäre sehr nett, wenn jemand meine Codes mal durchschauen könnte und Zeit hätte mal daran zu basteln ich habe es seit Tagen nicht hinbekommen auch mal ehrlich gesagt keine richtigen Erfahrungen mit Multithreaded-Server
 

ebruss17

Bekanntes Mitglied
Java:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;


public class Server {

    File serverdatei = new File("logfile.csv");
    private static ArrayList<String> eintragsliste = new ArrayList<String>();

  
    /**
     * Die Main kümmert sich um die Kommunikation des Servers mit dem Client via
     * Sockets und erstellt auch ein zu Beginn leeres Logfile. Außerdem regelt
     * sie den Datenverkehr der Threads des Servers. Hier wird ein Zeit- und
     * Datumsformat definiert, dass dann auf der Konsole zu den einzelnen
     * Aktionen angezeigt und im Logfile gespeichert wird.
     *
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws Exception {
    	

        System.out.println("\n>>> Der Server wird gestartet \n");
        
		ServerSocket myServerSocket = new ServerSocket(45678);
      
       
        while (true) {
        	
        	
        	Socket myClientSocket = myServerSocket.accept();
        
            BufferedReader lesenUeberSocket = new BufferedReader(new InputStreamReader(
                    			myClientSocket.getInputStream()));

            BufferedWriter schreibenUeberSocket = new BufferedWriter(new OutputStreamWriter(
                    			myClientSocket.getOutputStream()));

            
            SimpleDateFormat formater = new SimpleDateFormat("HH:mm:ss ");
            
            Date currentTime = new Date();

            String anmeldung = formater.format(currentTime) + ";"
                    + "Angemeldet an lokaler Adresse" + ";"
                    + myClientSocket.getLocalAddress() + "\n";

            eintragsliste.add(anmeldung);

            schreibeLog(eintragsliste);

            System.out.println(
            		"**********" + "\n" + "> " + formater.format(currentTime)
            		+ "\t" + 
            		"--> Local Address angemeldet: "
                    + myClientSocket.getLocalAddress());
            
            String eingabeVonClientLesen;

            try {
                while ((eingabeVonClientLesen = lesenUeberSocket.readLine()) != null) 
                {
        
                    int a = Integer.parseInt(eingabeVonClientLesen);

                    if ((a < 6) && (a > 0)) {
                    	
                    	
                        formater = new SimpleDateFormat("HH:mm:ss ");
                        currentTime = new Date();
                        auswahl(a, currentTime);
                        schreibeLog(eintragsliste);

                        System.out.println(
                        		"**********" + "\n" + "> " + formater.format(currentTime)
                                + "\t" + "Sie haben den Menuepunkt \'"
                                + a + "\' ausgewaehlt");

                        schreibenUeberSocket.write("Ihre Auswahl ist in Ordnung :-)");
                        schreibenUeberSocket.newLine();
                        schreibenUeberSocket.flush();
                    } 
                    else {
                        auswahl(a, currentTime);
                        schreibeLog(eintragsliste);
                        
                        System.out.println(
                        		"**********" + "\n" + "> " + formater.format(currentTime)
                                + "\t" + "Ungueltige Eingabe!");
                        
                        schreibenUeberSocket.write("Ihre Auswahl ist leider nicht in Ordnung :-(");
                        schreibenUeberSocket.newLine();
                        schreibenUeberSocket.flush();
                       
                    }
                }
            }
            catch (Exception e) {
            	System.out.println(
            			"**********" + "\n" + e.getMessage());
            }
            
            System.out.println(
            		"**********" + "\n" + "> " + formater.format(currentTime)
            		+ "\t" + 
            		"<-- Local Address abgemeldet: "
                    + myClientSocket.getLocalAddress());
            
            String abmeldung = formater.format(currentTime) + ";"
                    + "Abgemeldet von der lokalen Adresse" + ";"
                    + myClientSocket.getLocalAddress() + "\n";
            
            eintragsliste.add(abmeldung);
            schreibeLog(eintragsliste);
            //myClientSocket.close();
        }
    }
    
    
    /**
     * Diese Methode formatiert die Log-File Einträge und fügt diese dann durch
     * den Aufruf der Methode 'schreibeLog' dem Log-File 'logfile.csv' hinzu.
     *
     * @param a
     * @param zeit
     */
    public static void auswahl(int a, Date zeit) {
        StringBuilder gebeString = new StringBuilder();
        gebeString.append(zeit);
        gebeString.append(";");

        switch (a) {
            case 1:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("neue Person aufnehmen");
                gebeString.append(";");
                break;
            case 2:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("Records auflisten");
                gebeString.append(";");
                break;
            case 3:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("Records in eine Datei sichern");
                gebeString.append(";");
                break;
            case 4:
            	gebeString.append("Menüpunkt ");
                gebeString.append(a);
                gebeString.append(";");
                gebeString.append("Datei löschen");
                gebeString.append(";");
                break;
            default:
                break;
        }

        gebeString.append("\n");

        eintragsliste.add(gebeString.toString());
    }

   
    /**
     * Diese Methode schreibt die Einträge in die serverdatei "logfile.csv".
     */
    public static void schreibeLog(ArrayList<String> eintragsliste) {
        try {
       
            BufferedWriter bw = new BufferedWriter(new FileWriter("logfile.csv"));

            for (int i = 0; i < eintragsliste.size(); i++) {
                bw.write(eintragsliste.get(i));
            }

            bw.close();
           
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
    
    
}


Java:
import java.io.*;
import java.net.Socket;


/**
 * Die Klasse ControlerThread dient dazu, die Klasse ViewThread und die Klasse ModelThread
 * also die beiden Threads via Pipe miteinander zu verbinden und anschliessend zu starten.
 */
public class ControlerThread 
{

/**
* @param args
* @throws ClassNotFoundException
* @throws IOException
* Die main-Methode dient dazu, die beiden Threads (ModelThread und ViewThread) über
* die Pipe zum Laufen zu bringen.
* Innerhalb der main-Methode werden als erstes PipedReader und PipedWriter erzeugt.
* Anschliessend werden PipedReader und PipedWriter miteinander verbunden.
* Im nächsten Schritt wird ein neues ViewThread t1 und ein neues ModelThread t2 erzeugt,
* der ViewThread t1 bekommt als Parameter pr2 und pw1 und der ModelThread t2
* bekommt als Parameterübergabe pr1 und pw2. Dann werden die neu erzeugten Threads
* anschliessend asynchron gestartet.
* pw1 also die Pipe1 schreibt vom ViewThread zum ModelThread 
* und pw2 also Pipe2 schreibt vom ModelThread zum ViewThread.
*/
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException
{

	String requestToServer;

	String ipadresse = Input.readString("Geben Sie bitte die IP-Adresse zum Verbinden ein: ");
	Socket clientSocket = new Socket(ipadresse, 45678);

	System.out.println("Verbindung zum Server mit der Adresse "
            + clientSocket.getInetAddress() + " wurde hergestellt.");
	
	 //Kommunikationsmöglichkeiten über Sockets
	 BufferedWriter ueberSocketAnServerSenden = new BufferedWriter(new OutputStreamWriter(
	            clientSocket.getOutputStream()));
	    
	 //Antwort vom Server
	 BufferedReader ueberSocketVomServerLesen = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
	    
    
	 // Pipes zur Kommunikation anlegen
	 // Reader anlegen
	 PipedReader prControllerVonModel = new PipedReader();
	 PipedReader prControllerVonView = new PipedReader();
     PipedReader pr1 = new PipedReader();
	 PipedReader pr2 = new PipedReader();

	 
     //Writer anlegen
	 PipedWriter pwControllerZuModel = new PipedWriter();
	 PipedWriter pwControllerZuView = new PipedWriter();
	 PipedWriter pw2 = new PipedWriter();
	 PipedWriter pw1 = new PipedWriter();
	  
	  
	 pwControllerZuModel.connect(pr1);
	 pwControllerZuView.connect(pr2);
	 pw2.connect(prControllerVonModel);
	 pw1.connect(prControllerVonView);
	 
	  
	 ViewThread t1 = new ViewThread(pr2, pw1);
	 ModelThread t2 = new ModelThread(pr1, pw2);

	  
	 t1.start(); // asynchroner Start
	 t2.start(); // asynchroner Start
    
   // "a" wird zum Weiterleiten der eingegebenen Auswahl benötigt. 
   int a;
   
   while (true) {

       try {
    	   
    	   	a = prControllerVonView.read();
    	   	requestToServer = "" + a;
    	   	
    	   	//Mittels Socket "a" an den Server senden
    	   	ueberSocketAnServerSenden.write(requestToServer);
    	   	ueberSocketAnServerSenden.newLine();
    	   	ueberSocketAnServerSenden.flush(); // ohne flush würde requestToServer beim BufferedWriter drinnen bleiben und nicht an OutputStreamWriter weitergegeben werden, und der bw würde sagen es lohnt sich nicht weiter zu geben , es würde erhalten bleiben
    
    	   	String answer = ueberSocketVomServerLesen.readLine(); // blockiert bis ganze Zeile vom Server empfangen wurde.
    	   	System.out.println(answer); // Antwort zurück und ausgegeben
	   
    	   	pwControllerZuModel.write(a);
    	   	prControllerVonModel.read();
    	   	pwControllerZuView.write(0);
       	   }
       catch (Exception e)
       {
    	   e.printStackTrace();
           System.exit(1);
       }
      		 }
}
}


Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * Mithilfe dieser Klasse werden Methoden zur Eingabe und Ausgabe
 * auf der Konsole bereitgestellt.
 */
public class Input  
{

/**
* readChar()-Methode liest ein einzelnes Zeichen. BufferedReader liest Textinhalte
* gepuffert aus einem Character - Eingabestrom.
* Klasse BufferedReader stellt die Methode readLine zur Verfügung, um eine ganze Textzeile
* aus der Datei zu erhalten.
*/
public static char readChar()
{
  BufferedReader br;
  String inputString;
  char value = 0;

  br = new BufferedReader(new InputStreamReader(System.in));

  try
  {
    inputString = br.readLine();
    value = inputString.charAt(0);
  }
  catch(IOException _uh)
  {
    System.out.println("Lesefehler !");
  }
  catch(NumberFormatException ex)
  {
    System.out.println("Sie haben keinen int-Wert eingegeben !");
  }
    return value;
}


/**
* @param value
*/
public static char readChar(String value)
{
  System.out.println(value);
  return readChar();
}


/**
*  Methode readDouble() liest eine Zahl vom Typ double ein und 
*  gibt die Benutzereingabe zurück.
*/
public static double readDouble()
{
  BufferedReader br;
  String inputString;
  double value = 0.0;

  br = new BufferedReader(new InputStreamReader(System.in));

  try
  {
    inputString = br.readLine();
    value = Double.parseDouble(inputString);
  }
  catch(IOException _uh)
  {
    System.out.println("Lesefehler !");
  }
  catch(NumberFormatException ex)
  {
    System.out.println("Sie haben keinen double-Wert eingegeben !");
  }
    return value;
}


/**
* @param value
*/
public static double readDouble(String value)
{
  System.out.println(value);
  return readDouble();
}


/**
*  Methode readInt() liest Zahl vom Typ int von der Tastatur ein und
*  gibt diese als Ergebnis zurück.
*/
public static int readInt()
{
  BufferedReader br;
  String inputString;
  int value = 0;

  br = new BufferedReader(new InputStreamReader(System.in));

  try
  {
    inputString = br.readLine();
    value = Integer.parseInt(inputString);
  }
  catch(IOException _uh)
  {
    System.out.println("Lesefehler !");
  }
  catch(NumberFormatException ex)
  {
    System.out.println("Sie haben keinen int-Wert eingegeben !");
  }
    return value;
}


/**
* @param value
*/
public static int readInt(String value)
{
  System.out.println(value);
  return readInt();
}


/**
* readString() liest einzelnes Textwort von der Tastatur.
* Textwort besteht aus einem String.
*/
public static String readString()
{
  BufferedReader br;
  String inputString = "";

  br = new BufferedReader(new InputStreamReader(System.in));

  try
  {
    inputString = br.readLine();
  }
  catch(IOException _uh)
  {
    System.out.println("Lesefehler !");
  }
    return inputString;
}


/**
* @param value
* @param matche
* @param error_report
*/
public static String readString(String value, String matche, String error_report )
{
  BufferedReader br;
  String inputString = "";

  br = new BufferedReader(new InputStreamReader(System.in));
    
  try
  {
    do{
      System.out.print(value);//Name :
      inputString = br.readLine(); // lese solange alles ein bis enter
      
      if (inputString.matches(matche))
          return inputString;
        
      else
          System.out.println(error_report);
      }
    while(!inputString.matches(matche)); // fängt nochmal von vorne an wenn nicht stimmt
  }
  catch(IOException _uh)
  {
    System.out.println("Lesefehler !");
  }
    return inputString;
}


/**
* @param value
*/  
public static String readString(String value)
{
  System.out.println(value);
  return readString();
}
 

}


Java:
import java.io.*;

import java.util.*;



/**
 *
 */
public class ModelThread extends Thread
{

  File csvdatei = new File("adreli.csv");


  public static ArrayList<Person> personen = new ArrayList<Person>();

  
  private PipedReader reader;
  private PipedWriter writer;
  

/**
* Konstruktor mit 2 Parametern.
* @param reader
* @param writer
*/
public ModelThread(PipedReader reader, PipedWriter writer)
{

  super("ModelThread");
  this.reader = reader;
  this.writer = writer;
}


/**
* Die Klasse ModelThread wird über die sogenannte Pipe mithilfe dieser Methode zum Laufen gebracht.
* Falls die Eingaben aus der ViewThread-Klasse gelesen wurden, kann somit jetzt die jeweilige Methode
* ausgeführt werden. Der Thread der Benutzerseite wird gestartet.
* int a = reader.read(); liest von der Pipe, welcher Casefall eingegeben wurde.
* Mithilfe der Methode-write wird an das Hauptmenü ein Signal übergeben.
* Der Programmlauf wird in diesem Fall an die ViewThread-Klasse übergeben.
* Sobald die Eingabe aus der Klasse ViewThread gelesen ist, wird die jeweilige
* Methode der Klasse ModelThread ausgeführt.
*/
public void run()
{
  while (true)
  {

    try
    {
      int a = reader.read(); // es liest von der Pipe, welcher casefall eingegeben worden ist.
        switch (a)
        {

        case 1: // eine neue Person aufnehmen

          personeneingabe();
          break;

        case 2: // Records auflisten
          personenausgabe();
          break;

        case 3: // Records in eine Datei sichern
          sichern(personen);
          break;

        case 4: // Datei löschen
          fileLoeschen();
          break;

        case 5: // das Programm verlassen
          programmbeenden();
          break;

        default: // Falsche Zahl eingegeben
          System.out
          .println("\nSie haben keine gültige Zahl eingegeben, bitte geben Sie eine Zahl von 1 - 5 ein!");
        }

        writer.write(a);
      }
      catch (IOException io)
      {
        System.out.println("Es ist ein Fehler im ModelThread aufgetreten:" + "\n" + io.getMessage());
      }
  }
}


/**
* 2. while-Schleife fragt ab, ob Eingaben korrekt sind. Wenn die Eingaben korrekt sind,
* werden die Personenobjekte mit dem Befehl personen.add(p) in die ArrayList personen eingetragen.
*/
public void eingabenkorrektheit()
{
  boolean beenden = false;
    while (!beenden)
    {
      System.out.println();
      System.out.println("Geben Sie bitte Ihre Daten ein: ");
    System.out.println();
    Person p = new Person();
    p.readPerson();

     while (!beenden)
     {
               String antwort =Input.readString(
                        "Sind Ihre Eingaben korrekt?\n(J/j = Ja, N/n = Nein)");

               if (antwort.equals("J") || antwort.equals("j"))
                {
                  beenden = true;

                }
                else if (antwort.equals("N") || antwort.equals("n"))
                {
                  p.readPerson();
                    beenden = false;
                }
                else
                {
                    System.out.println(
                        "Ihre Eingabe ist nicht gültig, bitte nochmals versuchen!\n");
                    beenden = false;
                }

    }
            personen.add(p);

            String antwort = Input.readString(
                "Möchten Sie noch weitere Personendaten aufnehmen?\n(J/j = Ja, N/n = Nein)",
          "[jJnN]",
          "Ihre Eingabe war leider fehlerhaft, bitte versuchen Sie es erneut!");

            if (antwort.equals("J") || antwort.equals("j"))
            {
                beenden = false;
            }
            else if (antwort.equals("N") || antwort.equals("n"))
            {
                beenden = true;
            }
            else
            {
                System.out.println("Sie haben eine ungültige Eingabe betätigt, bitte erneut versuchen!\n");
                beenden = false;
            }
     }
}


/**
 * diese Methode ruft die Methode eingabenkorrektheit() auf, um abfragen zu können,
 * ob die eingegebenen Personeninformationen korrekt sind oder nicht.
 * Und ob der Benutzer noch weitere Personendaten aufnehmen möchte.
 *
 */
public void personeneingabe()
{
  eingabenkorrektheit();
}


/**
* Die Personeninformationen, die im ArrayList personen gespeichert wurden, werden mithilfe
* der Methode personenausgabe() einzeln, satzweise und nacheinander aufgelistet auf dem
* Bildschirm angezeigt.
*/
public void personenausgabe()
{
  for (int i = 0; i<personen.size(); i++)
  {
	  System.out.println("");
      System.out.println(i+1+"."+"Satz");
      System.out.println();
      System.out.println(personen.get(i).toString());
      Input.readString("Betätigen Sie bitte die <RETURN> - Taste um weiterzukommen\n");
  }
}


/**
* @param personen (ArrayList)
* Auslagerung der Informationen von Personobjekten in die
* Datei adreli.csv. FileWriter dient dazu, dass die
* entsprechenden Personendaten char-artig in die Datei adreli.csv
* geschrieben werden. Anhand der for-Schleife werden die
* einzelnen Attribute mittels BufferedWriter in die Datei
* geschrieben, jedoch getrennt und nicht hintereinander.
*/
public void sichern(ArrayList<Person> personen)
{
  try {

	  System.out.println("");
    BufferedWriter bw = new BufferedWriter(new FileWriter("adreli.csv"));


      for (Person p : personen)
      {

        bw.write(p.name + ";");
        bw.write(p.vorname + ";");
        bw.write(p.anrede + ";");
        bw.write(p.strasse + ";");
        bw.write(p.plz + ";");
        bw.write(p.ort + ";");
        bw.write(p.telefon + ";");
        bw.write(p.fax + ";");
        bw.write(p.bemerkung + ";" + "\n");
      }

      bw.close();

      System.out.println("Ihre Daten wurden in die Datei adreli.csv gespeichert!");

    }
  catch (IOException e)
    {
      System.out.println(e.getMessage());

    }
}


/**
* loescht Datei "adreli.csv" zusammen mit gespeicherten
* Personendaten von der Festplatte. Im try-Block wird versucht, die neu
* angelegte Datei adreli.csv von der Festplatte zu löschen. Falls es gelöscht
* wurde, soll auf dem Bildschrirm ausgegeben werden, dass die Datei adrelicsv
* erfolgreich gelöscht wurde. Im anderen Fall, falls es die Datei auf der Festplatte
* nicht gibt, soll eine Fehlermeldung ausgegeben werden, dass die Datei
* adreli.csv auf der Festplatte nicht vorhanden ist.
*/
public static void fileLoeschen()
{
    try {
    	System.out.println("");
    	File datei = new File("adreli.csv");
  
    	if(datei.exists())
    	{
    		datei.delete();
    		System.out.println("Die Datei " + "adreli.csv" + " wurde erfolgreich gelöscht.\n");
    	}
      else
      {
        System.out
        .println("Die Datei adreli.csv ist auf der Festplatte leider nicht vorhanden.\n");
      }
      }
    catch (Exception e)
    {
      System.out.println(e.getMessage());
    }
}


/**
* Mithilfe der Methode programmbeenden hat der Benutzer die Möglichkeit
* das Programm erfolgreich zu verlassen. System.exit(0); dient in dieser
* Methode dazu, damit der Benutzer das Programm vorzeitig beenden kann.
*/
public static void programmbeenden()
{
  System.exit(0);

}

}
 

ebruss17

Bekanntes Mitglied
Java:
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;

/**
 * Die Klasse ViewThread gibt das Hauptmenü aus. Das Hauptmenü wird 
 * anschliessend per Socket an den Server geschickt.
 * Über Pipes findet die Kommunikation zwischen ControlerThread und
 * ViewThread statt.
 */
public class ViewThread extends Thread
{


  private  PipedReader reader;
  private  PipedWriter writer;
  

/**
* @param reader
* @param writer 
* Der Konstruktor ViewThread mit 2 Parameterübergaben (PipedReader und PipedWriter). 
* PipedReader reader ist dazu da, um die Eingaben aus einem beliebigen Reader zu lesen.
* PipedWriter writer ist dazu da, um die Ausgabe in einen beliebigen Writer zu schreiben.
*/
public ViewThread(PipedReader reader, PipedWriter writer)
{
  super("ViewThread");
  this.reader = reader;
  this.writer = writer;
}

  

/**
 * Diese überschriebene run-Methode der Thread-Klasse ruft
 * die Methode hauptmenu auf und führt diese anschliessend aus.
 */
public void run()
{
  hauptmenu();

}


/**
* Das Hauptmenü wird auf der Konsole angezeigt.
* Innerhalb des try-Blocks findet die Kommunikation der Pipes statt.
* Es werden die Eingaben an die Klasse ModelThread über das Objekt
* PipedWriter geschickt. 
* Anschliessend wird aus der Klasse ModelThread über das Objekt  
* PipedReader gelesen.
*/
public void hauptmenu()
{
	while(true)
  {
    System.out.println("\r===========================");
    System.out.println(" ADRELI - Adressverwaltung ");
    System.out.println("===========================");
    System.out.println();
    System.out.println("Wollen Sie...");
    System.out.println();

    //BILDSCHIRMMENUE
    System.out.println("   eine neue Person aufnehmen: > 1");
    System.out.println("            Records auflisten: > 2");
    System.out.println("Records in eine Datei sichern: > 3");
    System.out.println("                Datei löschen: > 4");
    System.out.println("       das Programm verlassen: > 5");

    int a = Input.readInt();
    System.out.println("------------------------------------");
    System.out.println();

    if (a == 5) {
        System.out.println("\n" + "\n" + "Sie haben das Programm erfolgreich verlassen.");
        System.exit(1);
    } else {
    try
    {
     writer.write(a);
     reader.read();
    }
    catch(IOException io)
    {
      System.out.println("Fehler in ViewThread:" + "\n" +  io.getMessage());
    }
  }
}

}
}



Java:
import java.io.Serializable;


/**
 *  Mithilfe der Klasse "Person" werden Daten über Personen erfasst
 */
public class Person implements Serializable  
{

	public String name;
	public String vorname;
	public String anrede;
	public String strasse;
	public String plz;
	public String ort;
	public String telefon;
	public String fax;
	public String bemerkung;


	static final long serialVersionUID = 0L;



/**
* überprüft den eingegebenen Namen mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
public void read_in_Name()
{
	System.out.println("(z.B. Musterfrau)");
	name = Input.readString("Name: ","([A-ZÖÜ][a-zöü]+)",
			"\nGeben Sie Ihren Namen bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft den eingegebenen Vorname mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Vorname()
{
	System.out.println("(z.B. Maria)");
	System.out.println("(z.B. Ana-Marie)");
	vorname = Input.readString("Vorname: ",
			"([A-ZÖÜ][a-zöü]+)|([A-ZÖÜ][a-zöü]+[-][A-ZÖÜ][a-zöü]+)",
			"\nGeben Sie Ihren Vornamen bitte nach dem Muster des angezeigten Beispiels ein! ");
}


/**
* überprüft die eingegebene Anrede mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Anrede()
{
	System.out.println("(z.B. Frau oder Herr)");
	anrede = Input.readString("Anrede: ","(Herr|Frau)",
			"Diese Anrede wird leider nicht akzeptiert, bitte geben Sie Herr oder Frau ein!  ");
}


/**
* überprüft die eingegebene Strasse mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Strasse()
{
	System.out.println("(z.B. Musterstrasse 1)");
	System.out.println("(oder Unterer Hofweg 1)");
	strasse = Input.readString("Strasse: ",
			"([A-ZÖÜ][a-zöüß]+[/ ][0-9]+)|([A-ZÖÜ][a-zöüß]+[/ ][A-ZÖÜ][a-zöüß]+[/ ][0-9]+)",
			"\nGeben Sie Ihre Strasse bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Postleitzahl mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Plz()
{
	System.out.println("(z.B. D-12345)");
	plz = Input.readString("PLZ: ", "[A-Z]+[-][0-9]{1,5}",
		"\nGeben Sie Ihre PLZ bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft den eingegebenen Ort mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Ort()
{
	System.out.println("(z.B. Musterort)");
	ort = Input.readString("Ort: ", "([A-Z][a-z]+)|([A-ZÖÜ][a-zöü]+)",
		"\nGeben Sie Ihren Ort bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Telefonnummer mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Telefon()
{
	System.out.println("(z.B. +49 12345-12345");
	System.out.println("(z.B. 12345-12345");
	telefon = Input.readString("Telefon: ", "([/+][0-9]{2}[/ ])?[0-9]+[/-][0-9]+",
			"\nGeben Sie Ihre Telefonnummer bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Faxnummer mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Fax()
{
	System.out.println("(z.B. +49 12345-12345)");
	System.out.println("(oder 12345-12345");
	fax = Input.readString("Fax: ", "([/+][0-9]{2}[/ ])?[0-9]+[/-][0-9]+",
		"\nGeben Sie Ihre Faxnummer bitte nach dem Muster des angezeigten Beispiels ein!");
}


/**
* überprüft die eingegebene Bemerkung mithilfe des angegebenen regulären Ausdrucks
* auf syntaktische Korrektheit
*/
private void read_in_Bemerkung()
{
	System.out.println("Sie muessen nichts eingeben!");
	bemerkung = Input.readString("Bemerkung: ");
}


/**
*  Sammlung von Methoden
*/
public Person readPerson()
{
	read_in_Name();
	read_in_Vorname();
	read_in_Anrede();
	read_in_Strasse();
	read_in_Plz();
	read_in_Ort();
	read_in_Telefon();
	read_in_Fax();
	read_in_Bemerkung();

	return null;
}


/**
*  Ueberschriebene toString-Methode zur angepassten Ausgabe von Personenobjekten.
*/
public String toString() 
{
		String out = "Name: " + name + "\nVorname: " + vorname
				+ "\nAnrede: " + anrede + "\nStrasse: " + strasse + "\nPLZ: "
				+ plz + "\nOrt: " + ort + "\nTelefon: " + telefon + "\nFax:"
				+ fax + "\nBemerkung: " + bemerkung;
		return out;
}

}


ich habe ein Problem dass mein Server nicht mehrere Clients unterstützt wäre nett wenn du mir behilflich sein könntest oder versuchen könntest es umzusetzen weil ich mich Threads nicht auskenne. Ich habe ein projekt mit Server-Klasse erstellt und die restlichen Klassen (Input, Person, ControlerThread, ViewThread und ModelThread gehört dem neu erstellten Java-projekt Client. Da laut Aufgabenstellung Client und Server ganz getrennte Applikationen sein müssen habe ich 2 Projekte erstellt.
 
Zuletzt bearbeitet:
T

tröööt

Gast
sag mal rede ich irgendwie gegen die wand oder sowas ?
ich hab dir oben das beispiel gepostet wie es aussehen müsste ... die restliche programm-logik müsste man natürlich schon mal darauf anpassen können ... und sollte in der lage sein mit "non-final from inner class" auch was anfangen zu können ...

ist es denn wirklich SO schwer einfach mal das hier gepostete anzuwenden und sich auch wirklich mal die mühe zu machen das von mir gelinkte video-semester reinzuziehen und versuchen es zu verstehen und darauf bezogen mal ein paar fragen zu stellen ...

aber nee ... alles was du machst ist nach ner lösung förmlich zu betteln ... anstatt dich selbst mal dahinter zu klemmen ...
wenn du DREI MAL ein und den selben code postest obwohl dir schon nach dem ERSTEN mal gesagt wurd WAS genau du ändern muss und es dir dann sogar noch vorgemacht wird ... und du DANN nicht in der lage bist das zu übernehmen und den rest darauf anzupassen ... dann hast du es erlich gesagt verdient wie max in der sonne zu sthene und dafür die entsprechende bewertung auch zu kassieren ...

ich wette mit dir 100% das dir die nötigen grundlagen vermittelt wurden ... denn KEIN lehrer ... auch die schlechtesten ... stellen solche aufgaben ohne nötiges wissen vorher vermittelt zu haben ...
wenn man nich mitkommt und hilfestellungen ignoriert bei denen es teilweise wirklich für ganz dumme erklärt wird ... ist man selbst schuld und sollte nicht erwarten bei mehrfachem betteln auch nur irgendeine art von lösung zu bekommen ...


denk mal drüber nach ... handel entsprechend ... und vielleicht kommst du DANN auf ne lösung ...
 

AndiE

Top Contributor
Nach dem Post #11 ist es gar nicht so wichtig, mehrere Clients gleichzeitig bedienen zu können. Du solltest dich meiner Meinung nach darauf konzentrieren, dass die Anwendung überhaupt sinnvoll läuft.

Als Wirtschaftsinformatiker wirst du ja die Situation kennen, dass in einer Firma die Arbeitsplätze der Mitarbeiter mehrere Meter auseinanderliegen( im Büro, dem Lager, Versandusw.) . Die von ihnen (gemeinsam) benötigten Informationen liegen typischerweise auf einer zentralen Stelle, dem Server. Die Mitarbeiter nutzen den Client.
Soweit ein angenommenes Szenario- das ist datentechnischer Urschleim.
So wie du das kopiert hast, hast du die gesamte Datenhaltung im Client-Projekt. Wie soll der fremde Client, auf die gemeinsamen Daten zugreifen können, wenn .... es keine solchen gibt? Im Server passiert bis jetzt nichts in dieser Richtung, soweit ich das sehe.

Denke mal drüber nach!!
 
T

trääät

Gast
du könntest ja jetzt mal deinen überarbeiteten funktionierenden code posten ... vielleicht können andere davon lernen
 

ebruss17

Bekanntes Mitglied
Hallo Leute,

eine kurze Frage hätte ich noch :

Daten, die über Sockets ausgetauscht werden: Byte, ASCII oder char, UNICODE????

wäre nett, wenn sich jemand melden würde. Nochmals vielen Dank.
 

TKausL

Top Contributor
Über die Sockets werden immer Bytes übertragen. Was nachher rauskommt oder reingeht liegt an der Lese- bzw. Schreibklasse und deren Einstellung.
 
T

tröööt

Gast
ganz erlich : bist du des lesens mächtig ? oder besser : verstehst du auch das was du liest ?

[japi]Socket[/japi] liefert ganz klar einen [japi]InputStream[/japi] und einen [japi]OutputStream[/japi] ... das sind sog. RAW-streams ... und darüber laufen nun mal nur BYTEs ... WAS diese bytes am ende bedeuten kommt darauf an was du mit ihnen machst ...
wenn du z.b. [japi]InputStreamReader[/japi] bzw [japi]OutputStreamWriter[/japi] darauf anwendest machst du eigentlich nichts weiter als den bytes entsprechend eines gewissen [japi]Charset[/japi] eine bedeutung zuzuweisen ... und das wird , wenn nicht explizit angegeben , mit dem system-defaul-charset umgesetzt ... der unter windows nunmal Win1251 ist ...

ich habe bewusst sehr viele api-links eingebaut da man als java-entwickler eigentlich in der lage sein sollte diese 1) zu kennen 2) zu lesen und 3) zu verstehen ...
wie ich schon sagte : ich fühle mich als würde ich gegen eine wand reden wenn ich versuche dir was zu erklären ...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Server Client Audio Allgemeine Java-Themen 6
E Server Client Audio Allgemeine Java-Themen 0
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
C Java RMI Client - Server Allgemeine Java-Themen 0
S Simples Client Server Setup in Java Allgemeine Java-Themen 4
C Hang Man Server Client Allgemeine Java-Themen 3
C Hang man mit Server/Client Allgemeine Java-Themen 2
M Checksummenprüfung bei Client Server kommunikation Allgemeine Java-Themen 3
T Java Streaming-Server & Streaming-Client Allgemeine Java-Themen 4
0 Lösungsweg Client Server Kommunikation Fehlermeldung ausgeben Allgemeine Java-Themen 12
D Client / Server Allgemeine Java-Themen 23
T JPA Entity im Client-Server-Umfeld Allgemeine Java-Themen 19
D Versuch Server - Client anwendung Allgemeine Java-Themen 9
T Welcher Server? JSP und Client-Anwendung Allgemeine Java-Themen 4
MQue Server- Thread Client Allgemeine Java-Themen 2
D design client server Allgemeine Java-Themen 10
O binärer Suchbaum mit client server., objekte speichern. Allgemeine Java-Themen 2
F Java Server VM/ Client VM Allgemeine Java-Themen 7
A Client/Server-Anwendung Allgemeine Java-Themen 3
T Proxys: Idee für den Callback vom Server zum Client? Allgemeine Java-Themen 3
G Performance Problem bei der Übertragung Server zum Client Allgemeine Java-Themen 3
H Datenbank an ein Java Client Server Programm anschliessen Allgemeine Java-Themen 3
OnDemand ApacheCommon FTP Client zuckt nicht Allgemeine Java-Themen 3
M JVM: Client Software Logging und Profiling aktivieren Allgemeine Java-Themen 1
OnDemand REST Client programmierens Allgemeine Java-Themen 4
J Soap Client mit mehreren URLs in Servlets Allgemeine Java-Themen 0
T Google Distance Matrix API Hello World/ Client Secret Allgemeine Java-Themen 3
M OOP IRC Client Allgemeine Java-Themen 3
B Web-Anwendung funktioniert mit Java 1.8, aber nicht mit Java 1.7 (auf Client) Allgemeine Java-Themen 5
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Allgemeine Java-Themen 3
P CXF 3.0.1 WebService- Client Allgemeine Java-Themen 0
B Java Mail Client als Outlook ausgeben Allgemeine Java-Themen 2
Z Java E-Mail Client mit End-to-End-Verschlüsselung Allgemeine Java-Themen 4
M HTTP Client Zertifikat sicher übertragen? Wie? Allgemeine Java-Themen 2
eskimo328 Swing Client Anwendung für MAC OS (Update Routine) Allgemeine Java-Themen 6
Z Threads Thread für einen Client Allgemeine Java-Themen 9
J Zugriff auf Poker-Client Fenster Allgemeine Java-Themen 14
G REST Client / URL Parser Allgemeine Java-Themen 2
S Java Kommandozeilen - Client Allgemeine Java-Themen 3
M Client für einen Webservice erstellen (ONVIF) Allgemeine Java-Themen 3
B mehrere services in einem client Allgemeine Java-Themen 10
J JSP Client LInk einbauen Allgemeine Java-Themen 15
J Client Allgemein Allgemeine Java-Themen 10
V Ausführung Client- oder Serverseitig? Allgemeine Java-Themen 13
S SMTP-Limit bei Newsletter-Client Allgemeine Java-Themen 5
thE_29 Simpler FTP Client Allgemeine Java-Themen 3
J java vnc client verbessern: KeyEvent.VK_ALT keine Wirkung? Allgemeine Java-Themen 12
E NT-Anmeldung in Java Client-Applikation nutzen. JAAS ? Allgemeine Java-Themen 5
T einen SVN- oder QVCS-Client selber programmieren Allgemeine Java-Themen 2
M Tool zum autom. Client-Update Allgemeine Java-Themen 2
M kennt jemand nen gute email client in java mit imap? Allgemeine Java-Themen 3
A Was ist bei einem Servlet beim Client notwendig? Allgemeine Java-Themen 22
D ldap zugriff mit Java Client Allgemeine Java-Themen 2
A Daten-Synchronisation Client <-> Datenquelle (DB) ? Allgemeine Java-Themen 6
G Servlet - "Client immer am neuesten Stand" Allgemeine Java-Themen 2
G EMail Client Allgemeine Java-Themen 7
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
Jose05 Speicherung auf einem Server Allgemeine Java-Themen 1
D Live-Scripting im Server Allgemeine Java-Themen 6
Monokuma Threadproblem mit Sockets und Server Allgemeine Java-Themen 7
T imagej-server NullPointerException Allgemeine Java-Themen 1
W Server-Thread schreibt nicht alle Dateien Allgemeine Java-Themen 6
B Datei/Ordner auf Server zugreifen/erstellen Allgemeine Java-Themen 2
M TomEE auf Windows Server 2016 installieren Allgemeine Java-Themen 4
bueseb84 Git : Mehrere Server verwenden Allgemeine Java-Themen 3
P Am Application Server - Selbe files aber trotzdem CNF Allgemeine Java-Themen 2
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
J Java - hoher Ramverbraucht auf WTS Server Allgemeine Java-Themen 8
C TCP Server und BufferedReader Leerstring im Stream? Allgemeine Java-Themen 5
C Logfile upload zu einem externen filezilla sftp server Allgemeine Java-Themen 6
K Server mieten, Berechnungen darauf ausführen Allgemeine Java-Themen 14
Anfänger2011 Java Server oder lieber was anderes Allgemeine Java-Themen 16
F Best Practice Server und Clients Allgemeine Java-Themen 10
E JavaFX RMI extrem langsam wenn Server nicht läuft Allgemeine Java-Themen 5
D Best Practice Java Application Server , Docker oder was? Allgemeine Java-Themen 15
L Suche nach CalDav Server API Allgemeine Java-Themen 0
K Classpath JDBC Driver auf Server Allgemeine Java-Themen 4
J Programm meldet "Keine Rückmeldung" nach Verbindung zum Server Allgemeine Java-Themen 4
I Installer, der JAVA EE Server und DB installiert Allgemeine Java-Themen 10
M Kapselung JasperReports Server und Java Allgemeine Java-Themen 5
P Java Fehler auf Win2008 Server java.io.FilePermission IE8 Version JRE 1.7.0_51 Allgemeine Java-Themen 7
M Dateien aus einem Verzeichnis auf einem Server auflisten Allgemeine Java-Themen 5
C Mit Pc Awendungen auf Server starten Allgemeine Java-Themen 8
B Input/Output Server Startet, Jedoch Kein Output. Allgemeine Java-Themen 1
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
R Fragen zu Server + UI Allgemeine Java-Themen 2
D Player Objekt - Frame über Server anzeigen lassen. Allgemeine Java-Themen 3
U AWT simulierter Tastendruck auf Virtual Server Allgemeine Java-Themen 7
Z Socket [Chatprogramm] Nachrichten vom Server anzeigen lassen Allgemeine Java-Themen 6
E Methoden Server Benutzer abfrage Allgemeine Java-Themen 2
N COM Server ansteuern / KISSsoft Allgemeine Java-Themen 3
N URLConnection - Server abgeschaltet Allgemeine Java-Themen 2
A Parser verursacht Speicherprobleme auf Server Allgemeine Java-Themen 2
T Mit Java auf Dateien zugreifen die auf einem Server liegen Allgemeine Java-Themen 5
J Problem beim Auslesen einer Datei vom Server Allgemeine Java-Themen 4
T jar Archiv auf Server ausführen Allgemeine Java-Themen 3
J Application Server Allgemeine Java-Themen 2
A Input/Output Applet-Zugriff auf PHP-Schnittstelle (externer Server) Allgemeine Java-Themen 22
C game-server GUI erstellen Allgemeine Java-Themen 13

Ähnliche Java Themen

Neue Themen


Oben