# Programm umschreiben von Pipes auf Sockets



## Ahnungslos10 (22. Nov 2009)

Hallo zusammen...

Ich habe hier ein Programm, das über Pipes Daten hin und herschiebt. Es handelt sich hierbei um eine Adressverwaltung. Nun soll es so umgebaut werden, dass es über Sockets (Server/Clients) läuft. Leider hab ich sehr wenig Ahnung, wie das ganze ablaufen soll. Ich hatte mich auch auf diversen Homepages umgeschaut, aber werde hieraus einfach nicht schlau 

Kann mir da jemand Denkanstöße geben?

Anbei die einzelnen Klassen


```
import java.io.*;

//@author X

public class Controller extends Thread
{

    //In der Main Methode werden die Threads und die Pipes initialisiert.

	public static void main(String[]args)
	{
		try
		{
		PipedReader pr1=new PipedReader();
		PipedWriter pw1=new PipedWriter();
		pw1.connect(pr1);

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

		View t1=new View(pw1, pr2);
		Model t2=new Model(pw2, pr1);
		
		t1.start();
		t2.start();
		}
		
		catch(IOException io)
		{
		System.out.println("Fehler beim Verbinden der Pipe");
		}
	}
}
```

[Java]
import java.io.*;

//@author X

public class Model extends Thread
{
	PipedWriter out;
	PipedReader in;

	Adresse array[]=new Adresse[0];

	/**Diese Methode dient zum Speichern der erst eingegebenen und dann
	im Array abgelegten und aufgelisteten Adressdaten*/


	public void speicher(Adresse[] array)
	{

		try {
		RandomAccessFile rafile = new RandomAccessFile("adreli.csv","rw");
		for (int i=0; i<array.length;i++)
		{
			rafile.writeBytes(array_.getDaten());
		}
		rafile.close ();
		}
		catch (FileNotFoundException fnfex)
		{
			System.out.println(fnfex.getMessage());
		}
		catch (IOException ioex)
		{
			System.out.println(ioex.getMessage());
		}
		eingabe("h");
	}


	/**Diese Methode dient dazu, dass man die gespeicherten Daten
	laden kann um sie dann aufzulisten*/


	public  Adresse[] lesen()
	{

		Adresse[] a = new Adresse[0];
		try
		{
		    RandomAccessFile rafile = new RandomAccessFile("adreli.csv","rw");
			for(int i = 0;true;i++)
			{
				String s = rafile.readLine();

				if (s==null)
				{
					break;
				}
				a = add(a, new Adresse(s));

			}
		}
		catch (FileNotFoundException fnfex)
		{
			System.out.println(fnfex.getMessage());
		}
		catch (IOException ioex)
		{
			System.out.println(ioex.getMessage());
		}
		eingabe("h");
		return a;

	}


	/**Erweiterung des Arrays um 1*/



	public  Adresse[] add(Adresse[] a, Adresse c)
	{

		Adresse[] r = new Adresse[a.length+1];
		for(int i = 0; i<a.length;i++)
		{
			r=a;
		}
		r[a.length]=c;


		return r;
	}


	/**Löschen der Datei*/


	public void loeschen()
	{

		File rafile = new File("adreli.csv");
		if(rafile.exists())
		{
			rafile.delete();
		}

		eingabe("h");


   }


	/**Der Konstruktor ruft mit SUPER den Konstruktor 
	 * der Basis- Klasse auf und übergibt Parameter*/


public Model(PipedWriter out, PipedReader in)
{
	super();
	this.in = in;
	this.out = out;

}

/**In der Methode wird der Thread der Benutzerseite gestartet.*/

public  void run()
{

	while(true)
	{


	int a = Integer.parseInt(ausgabe());



	switch(a)
	{
		case 1:array= this.add(array,new Adresse());eingabe("h");break;
		case 2:
		    if(array.length>0)
			{
			   for (int i = 0; i<array.length; i++) array.Ausgabe();

			  eingabe("h");
			}

			break;

		case 3:array = lesen();break;
		case 4:speicher(array);break;
		case 5:loeschen();break;
		case 6:System.exit(0);break;  
    }
	}



}

/**Die Methode kommuniziert mit der Pipe.*/


public void eingabe(String s)
{

	try
	{
		this.out.write(s+"\n");
	}
	catch (IOException e)
	{
		System.out.println("Verbindungsfehler!");

	}
}


/**Die Methode kommuniziert mit der Pipe.*/

public String ausgabe()
{


	char c = (char) 0;
	String s = "";
	do
	{
		try
		{
			if (in.ready())
			{
				c = (char) in.read();
			}
			s = s + c;

		}
		catch (IOException e)
		{
			System.out.println("Verbindungsfehler!");
		}
	} while (c != '\n');

	return(s.trim());

}
}
[/code]



		Java:In die Zwischenablage kopieren


import java.util.regex.*;

//@author X

 public class Adresse
{
	String anrede;
	String name;
	String vorname;
	String strasse;
	String plz;
	String ort;
	String telefon;
	String fax;
	String bemerkung;
	String datenOk;


    /**Methode zum Speichern in der Datei*/


	public String getDaten()
	 {


		String record;

		record=anrede+";"+name+";"+vorname+";"+strasse+";"+plz+";"+ort+
		";"+telefon+";"+fax+";"+bemerkung+"\r\n";

		return record;
	 }


     /**Eingabe der Adressdaten mit Aufruf zur Prüfung auf festgelegte Syntaktische Korrektheit*/


	 Adresse()
	 {


        System.out.println("Bitte geben Sie die Daten ein:");
		System.out.println();
		anrPruefen();
		nPruefen();
		nachnPruefen();
		strPruefen();
		plzPruefen();
		ortPruefen();
		telPruefen();
		faxPruefen();
		bemerPruefen();
		pruefeEingaben();
		System.out.println();

	}



	/**Ausgabe der gespeicherten Daten*/

	public void Ausgabe()
	{

		System.out.println("Anrede: "+anrede);
		System.out.println("Name: "+name);
		System.out.println("Vorname: " +vorname);
		System.out.println("Strasse: "+strasse);
		System.out.println("PLZ: "+plz);
		System.out.println("Ort: "+ort);
		System.out.println("Telefon: "+telefon);
		System.out.println("FAX: "+fax);
		System.out.println("Bemerkung: "+bemerkung);
		System.out.println();
		StdInput.readString("Enter Druecken!");
    }


    /**Aufsplittung der in der Datei gespeicherten Daten*/
    Adresse(String s)
    {


		String[] a = s.split(";");
		anrede = a[0];
		name = a[1];
		vorname = a[2];
		strasse = a[3];
		plz = a[4];
		ort = a[5];
		telefon = a[6];
		fax = a[7];
		bemerkung = a[8];

	}
	public void pruefeEingaben()
		 {


				System.out.println();
			    System.out.println("Anrede: "+anrede);
			 	System.out.println("Name: "+name);
			 	System.out.println("Vorname: " +vorname);
			 	System.out.println("Strasse: "+strasse);
			 	System.out.println("PLZ: "+plz);
			 	System.out.println("Ort: "+ort);
			 	System.out.println("Telefon: "+telefon);
			 	System.out.println("FAX: "+fax);
			 	System.out.println("Bemerkung: "+bemerkung);
			 	System.out.println();


					boolean n;

					// Abfrage, sind alle Eingaben korrekt?
					System.out.println("Sind die Eingaben korrekt?(Ja/Nein) ");
					datenOk = StdInput.readString();

					{
				// Eingabe wird auf syntaktische Korrektheit überprüft
						n = Pattern.matches("(Ja|ja|J|j)", datenOk);
						
					

				// wird nicht mit Ja, ja, J oder j geantwortet muss man alle Eingaben wiederholen!

						if (n == false)
						{
							System.out.println("Bitte geben Sie die Daten ein:");
							System.out.println();
							anrPruefen();
							nPruefen();
							nachnPruefen();
							strPruefen();
							plzPruefen();
							ortPruefen();
							telPruefen();
							faxPruefen();
							bemerPruefen();
							System.out.println();
							pruefeEingaben();
							System.out.println();
						}
						else
						{
							System.out.println("Möchten sie eine weitere Person aufnehmen?(Ja/Nein) ");
							datenOk = StdInput.readString();
							{
								n = Pattern.matches("(Ja|ja|J|j)", datenOk);
								if (n == true)
								{
									System.out.println("Bitte geben Sie die Daten ein:");
									System.out.println();
									anrPruefen();
									nPruefen();
									nachnPruefen();
									strPruefen();
									plzPruefen();
									ortPruefen();
									telPruefen();
									faxPruefen();
									bemerPruefen();
									System.out.println();
									pruefeEingaben();
									System.out.println();
								}
							}
						}
					}

		}


		 /** Prüfen der Eingaben mit pattern matches*/


		    public String anrPruefen()
		    {
				boolean n;

				// Eingabe der Anrede
				System.out.println("Anrede: ");
				anrede = StdInput.readString();
				do
				{
				// Eingabe wird auf syntaktische Korrektheit überprüft
					n = Pattern.matches("(Herr|Frau|Dr|Prof|Prof Dr)", anrede);

				// Eingabe syntaktisch nicht korrekt, Anzeige von "Fehlermeldung"

					if (n == false)
					{
						System.out.println("Anrede nicht korrekt!");
						System.out.println("Anrede: ");
						anrede = StdInput.readString();
					}
				}
				while (n == false);
				// Falls die Eingabe korrekt --> Programm wird weitergeführt

				return anrede;
			}


		    public String nPruefen()
			{
				boolean n;


				// Eingabe des Vornamens
				System.out.println("Vorname: ");
				vorname = StdInput.readString();
				do
				{
				// Eingabe wird auf syntaktische Korrektheit überprüft
					n = Pattern.matches("[A-Z]([a-z]+)((([ ]?)([-]?)"
							+ "([A-Za-z]))+)", vorname);

				// Eingabe syntaktisch nicht korrekt, Anzeige von "Fehlermeldung"

					if (n == false)
					{
						System.out.println("Bitte überprüfen Sie Ihre Eingabe!");
						System.out.println("Vorname: ");
						vorname = StdInput.readString();
					}
				}
				while (n == false);
				// Falls die Eingabe korrekt --> Programm wird weitergeführt
				return vorname;
			}


		    public String nachnPruefen()
			{
				boolean n;


				// Eingabe des Nachnamens
				System.out.println("Nachname: ");
				name = StdInput.readString();
				do
				{
				// Eingabe wird auf syntaktische Korrektheit überprüft
					n = Pattern.matches("[A-Z]([a-z]+)((([ ]?)"
							+ "([-]?)([A-Za-z]))+)", name);

				// Eingabe syntaktisch nicht korrekt, Anzeige von "Fehlermeldung"

					if (n == false)
					{
						System.out.println("Bitte überprüfen Sie Ihre Eingabe");
						System.out.println("Nachname: ");
						name = StdInput.readString();
					}
				}
				while (n == false);
				// Falls die Eingabe korrekt --> Programm wird weitergeführt
				return name;
			}

		  
		    public  String strPruefen()
			{
				boolean n;


				// Eingabe der Straße
				System.out.println("Strasse: ");
				strasse = StdInput.readString();
				do
				{
				// Eingabe wird auf syntaktische Korrektheit überprüft
					n = Pattern.matches("[A-Z]((([a-zA-Z])+)(([."
							+ "]?)([ ]?)([-]?)?))*[0-9]{1,3}[a-zA-Z]?", strasse);

				// Eingabe syntaktisch nicht korrekt, Anzeige von "Fehlermeldung"

					if (n == false)
					{
						System.out.println("Bitte überprüfen Sie Ihre Eingabe!");
						System.out.println("Strasse: ");
						strasse = StdInput.readString();
					}
				}
				while (n == false);
				// Falls die Eingabe korrekt --> Programm wird weitergeführt
				return strasse;
			}

		 
			public  String plzPruefen()
			{
				boolean n;


				// Eingabe der PLZ
				System.out.println("Plz: ");
				plz = StdInput.readString();
				do
				{
				// Eingabe wird auf syntaktische Korrektheit überprüft
					n = Pattern.matches("([0-9]){5,5}", plz);

				// Eingabe syntaktisch nicht korrekt, Anzeige von "Fehlermeldung"

				if (n == false)
				 {
					System.out.println("Ihre PLZ hat nicht das richtige Format!");
					System.out.println("Plz: ");
					plz = StdInput.readString();
				 }
				}
				while (n == false);
				// Falls die Eingabe korrekt --> Programm wird weitergeführt
				return plz;
			}


			 /** Diese Methode dient dazu, die Eingegebenen
			  * Daten auf Ihre Syntaktische Richtigkeit zu prüfen
			  */



			public  String ortPruefen()
			{
				boolean n;


				// Eingabe des Ortes
				System.out.println("Ort: ");
				ort = StdInput.readString();
				do
				{
				// Eingabe wird auf syntaktische Korrektheit überprüft
					n = Pattern.matches("[A-Z]([a-z]+)((([ ]?)([-]?)"
							+ "([A-Za-z]))+)", ort);

				// Eingabe syntaktisch nicht korrekt, Anzeige von "Fehlermeldung"

					if (n == false)
					{
						System.out.println("Bitte überprüfen Sie Ihre Eingabe!");
						System.out.println("Ort: ");
						ort = StdInput.readString();
					}
				}
				while (n == false);
				// Falls die Eingabe korrekt --> Programm wird weitergeführt
				return ort;
			}


			public  String telPruefen()
			{
				boolean n;


				// Eingabe der Telefonnummer
				System.out.println("Telefon: ");
				telefon = StdInput.readString();
				do
				{
					// Eingabe wird auf syntaktische Korrektheit überprüft
					n = Pattern.matches("(([0-9]{4,6})(([ ]?)([-]?)([/]?)"
							+ "(([0-9]){3,9})))|([0-9]{7,15})", telefon);

					// Eingabe syntaktisch nicht korrekt, Anzeige von "Fehlermeldung"

				if (n == false)
				 {
				    System.out.println("Ihre TelNr. hat das falsche Format!");
					System.out.println("Telefon: ");
					telefon = StdInput.readString();
				 }
				}
				while (n == false);
				// Falls die Eingabe korrekt --> Programm wird weitergeführt
				return telefon;
			}


			public  String faxPruefen()
			{
				boolean n;


				// Eingabe der FAX Adresse
				System.out.println("FAX: ");
				fax = StdInput.readString();
				do
				{
				// Eingabe wird auf syntaktische Korrektheit überprüft
					n = Pattern.matches("(([0-9]{4,6})(([ ]?)([-]?)([/]?)"
							+ "(([0-9]){3,9})))|([0-9]{7,15})", telefon);

				// Eingabe syntaktisch nicht korrekt, Anzeige von "Fehlermeldung"

				if (n == false)
				 {
				   System.out.println("Ihre FAX-Nummer besitzt nicht das richtige Format!");
				   System.out.println("FAX: ");
				   fax = StdInput.readString();
				 }
				}
				while (n == false);
				// Falls die Eingabe korrekt --> Programm wird weitergeführt
				return fax;
			}


			public  String bemerPruefen()
			{
				boolean n;


				// Eingabe der Bemerkung
				System.out.println("Bemerkung: ");
				bemerkung = StdInput.readString();
				do
				{
				// Eingabe wird auf syntaktische Korrektheit überprüft
					n = Pattern.matches("[A-Za-z]*(([.]?)([ ]?)" + "([-]?)([/]?)([A-Za-z]))*|([ ]?)*", bemerkung);

				// Eingabe syntaktisch nicht korrekt, Anzeige von "Fehlermeldung"

					if (n == false)
					{
						System.out.println("Ihre Eingabe war im falschen Format!");
						System.out.println("Bemerkung: ");
						bemerkung = StdInput.readString();
					}
				}
				while (n == false);
				// Falls die Eingabe korrekt --> Programm wird weitergeführt
				return bemerkung;
			}
	}




		Java:In die Zwischenablage kopieren


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

//@author X

public class View extends Thread
{
	
	PipedWriter out;
	PipedReader in;


	/**Die Methode stellt das Menü bereit und sendet
	 * Usereingaben über die Pipe nach Daten.*/
	
	
	public void menue()
		{

		System.out.println("ADRELI - Adressverwaltung");
		System.out.println();
		System.out.println("Wollen Sie...");
		System.out.println();
		System.out.println("eine neue Person aufnehmen:         1");
		System.out.println("Datensaetze auflisten:              2");
		System.out.println("Datensaetze aus einer Datei laden:  3");
		System.out.println("Datensaetze in eine Datei sichern:  4");
		System.out.println("Datei loeschen:                     5");
		System.out.println("Das Programm verlassen:             6");
		System.out.println();

		
		String a;
				a=StdInput.readString("Geben Sie eine Aktion ein ");
				System.out.println();
				
				eingabe(a);

	}

	
	/**Der Konstruktor ruft mit SUPER den Konstruktor 
	 * der Basis- Klasse auf und übergibt Parameter*/

	public View(PipedWriter out, PipedReader in)
	{
		super();
		this.in = in;
		this.out = out;
		
	}
	
	
	/**In der Methode wird der Thread des Menüs gestartet.*/
	
	public void run()
	{
		menue();
		
		while (true) 
		{
			if(ausgabe().equals("h")) menue();
		}

	}
	
	
	/**Die Methode kommuniziert mit der Pipe.*/
	
	public void eingabe(String s)
	{

		try
		{
			this.out.write(s+"\n");
		}
		catch (IOException e)
		{
			System.out.println("Verbindungsfehler!");

		}
}
	
	
	/**Die Methode kommuniziert mit der Pipe.*/
	
	public String ausgabe()
	{
		

		char c = (char) 0;
		String s = "";
		do
		{
			try
			{
				if (in.ready())
				{
					c = (char) in.read();
				}
				s = s + c;
				
			}
			catch (IOException e)
			{
				System.out.println("Verbindungsfehler!");
			}
		} while (c != '\n');
		
		return(s.trim());
		
	}
}


Danke im Voraus_


----------



## Ahnungslos10 (22. Nov 2009)

Mist... kann meinen Beitrag nicht editieren, sorry

Also mein eigentliches Problem ist es, dass ich die Daten, die in den jeweiligen klassen bisher wie gesagt über pipedreader und writer ausgetauscht werden nun als Objekte über Sockets geschickt werden sollen.

Das sollte ja irgendwie mit ObjectInputStream bzw output funktionieren, wenn ich da nicht komplett falsch liege. Das ganze soll auf meinem lokalen rechner funktionieren (localhost).


Ich brauche ja eine Servermain, die den Server startet und auf Daten des Clients wartet. Ich kann mir vorstellen, dass die Lösung sehr einfach ist, da das Programm ja nun schon über Threads verfügt. Allerdings fehlt mir da der letzte Denkanstoß um da wirklich was reissen zu können


----------



## tuxedo (23. Nov 2009)

Vielleicht solltest du dir mal ein "Hello World" oder "Echo Server" Netzwerksocket-Beispiel anschauen.

Vom Socket bekommst du Input- und OutputStream. Darauf kannst du den ObjectInput- und ObjectOutputStream aufsetzten. 

Dann nur noch deine Reader und Writer auf den Object*Stream anpassen und fertig. 

- Alex


----------



## Ahnungslos10 (23. Nov 2009)

Ich hab mir jetzt mal ein Client Server Programm gemacht, aber ich bekomm das Objekt nicht ausgegeben


```
import java.net.*;
import java.io.*;

public class KleinerServer {
	
	ServerSocket server = new ServerSocket (1234);

	KleinerServer() throws IOException {
		while (true) {
			Socket client = server.accept();
			InputStream input = client.getInputStream();
			OutputStream output = client.getOutputStream();
			ObjectInputStream oIn = new ObjectInputStream( new BufferedInputStream( client.getInputStream()));
			ObjectOutputStream oOut = new ObjectOutputStream( new BufferedOutputStream( client.getOutputStream()));
			int zahl1 = input.read();
			int zahl2 = input.read();
			Object a = oIn.readObject();
			output.write(zahl1 + zahl2);
			output.writeObject();
			output.flush();
			input.close();
			output.close();
		}
	}

	public static void main (String[] args) {
		try {
			KleinerServer server = new KleinerServer();
		}
			catch (IOException e) {
			System.out.print(e);
		}
	}
}
```

Mit den Strings funktioniert das wunderbar, aber wie kann ich nun mein Objekt vom Client ausgeben?


```
import java.net.*;
import java.io.*;

public class Client {
	
	Client() throws IOException {
		Socket server = new Socket ("localhost",1234);
		InputStream input = server.getInputStream();
		OutputStream output = server.getOutputStream();
		ObjectInputStream oIn = new ObjectInputStream( new BufferedInputStream( server.getInputStream()));
		ObjectOutputStream oOut = new ObjectOutputStream( new BufferedOutputStream( server.getOutputStream()));
		output.write(5);
		output.write(10);
		oOut.writeObject("test");
		output.flush();
		System.out.println(input.read());
		server.close();
		input.close();
		output.close();
	}

	public static void main (String[] args) {
		try {
			Client client = new Client();
		}
			catch (IOException e) {
			System.out.print(e);
		}
	}
}
```


----------



## tuxedo (23. Nov 2009)

In deinem Servercode, Zeile 19 ... da fehlt doch das Objekt?! AFAIK kann man da auch das Argument nicht einfach weglassen?!

- Alex


----------



## Ahnungslos10 (23. Nov 2009)

Oh hoppla, da hat es das a rausgemacht. Also die Zeile würde so aussehen:


```
output.writeObject();
```

das Objekt kommt ja aus Zeile 17


```
Object a = oIn.readObject();
```

Oder hab ich da was falsch verstanden?


----------



## Ahnungslos10 (23. Nov 2009)

hmpf schon wieder falsch  So sollte das aussehen:


```
output.writeObject(a);
```

Eclipse gibt mir da ne Fehlemeldung aus: "The method writeObject(Object) is undefined for the type OutputStream"


----------



## tuxedo (23. Nov 2009)

Ahnungslos10 hat gesagt.:


> Eclipse gibt mir da ne Fehlemeldung aus: "The method writeObject(Object) is undefined for the type OutputStream"



Womit wir beim Thema wären: "Lesen bildet".

Eclipse hat leider vollkommen recht. Du benutzt da den OutputStream und nicht den ObjectOutputStream ...

Einfach den richtigen Stream benutzen und schon klappts auch mit dem Objekt senden.

Ach ja: Kleiner Tipp noch: Lege dich auf eine Streamart fest. Mal den einen Streamtyp, dann den anderen benutzen bringt nur probleme mit sich. Also am besten alles auf Object*Stream umbauen.

Und noch ein brauchbarer Hinweis: [JavaSpecialists 088] - Resetting ObjectOutputStream

- Alex


----------



## Ahnungslos10 (23. Nov 2009)

OK *handaufstirnklatsch* war ja sehr intelligent den alten stream zu nehmen 

hab das nun geändert, dass er eben aus dem objectstream das objekt holt. Allerdings bringt er mir nun in Zeile 17 eine Fehlermeldung
"Unhandled exception type ClassNotFoundException" Ich steh total auf dem schlauch... er sollte doch jetzt das Objekt von client bekommen und ausgeben 

Wenn ich mein Objekt (a) in Zeile 17 mit reinschreibe kommt folgender Fehler: "The method readObject() in the type ObjectInputStream is not applicable for the arguments 
	 (Object)"

Ich blick langsam keinen meter mehr durch


----------



## tuxedo (23. Nov 2009)

Da durch den Object*Stream beliebige Klassen transportiert werden können, besteht die Gefahr dass beim lesen ein Objekt ankommt, welches nicht im Classpath aufgelöst werden kann. Du musst das ganze mit einem entsprechenden try/catch für ClassNotFoundException versehen. Eclipse sollte dir das aber bereits vorgeschlagen haben.

Solange in deinem Code noch irgendwo etwas "rot" ist hast du irgendwas übersehen oder falsch gemacht. Also erst versuchen die Fehler weg zu bringen bevor du's laufen lässt.

- Alex


----------



## Ahnungslos10 (23. Nov 2009)

Ja das mit der Try/Catch Exception hatte ich schon probiert. Ich musste daraufhin mein Object neu initialisieren, was er mit "null" gelöst hat. Jetzt kommt die erwartete Ausgabe... nämlich nichts. Der Code sieht nun folgendermaßen aus:


```
import java.net.*;
import java.io.*;
 
public class KleinerServer {
    
    ServerSocket server = new ServerSocket (1234);
 
    KleinerServer() throws IOException {
        while (true) {
            Socket client = server.accept();
            InputStream input = client.getInputStream();
            OutputStream output = client.getOutputStream();
            ObjectInputStream in = new ObjectInputStream( new BufferedInputStream( client.getInputStream()));
            ObjectOutputStream out = new ObjectOutputStream( new BufferedOutputStream( client.getOutputStream()));
            Object a = null;
			try {
				a = in.readObject();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
            out.writeObject(a);
            out.flush();
            in.close();
            out.close();
        }
    }
 
    public static void main (String[] args) {
        try {
            KleinerServer server = new KleinerServer();
        }
            catch (IOException e) {
            System.out.print(e);
        }
    }
}
```

Das "Problem" müsste ja nun hier liegen:


```
Object a = null;
```

Weil er nicht zugelassen hat, dass ich es mir vom Client hole...

Ich danke dir jetzt schonmal für deine Bemühungen


----------



## tuxedo (23. Nov 2009)

das problem lag noch ganz woanders. hab mal kurz drubergeschaut und das Ding gefixt:


```
import java.net.*;
import java.io.*;
 
public class KleinerServer {
    
 
    public KleinerServer() {
    	ServerSocket server;
		try {
			server = new ServerSocket (12344);
	        while (true) {
	        	System.out.println("waiting for client ...");
	            Socket client = server.accept();
	            System.out.println("Client connected ... now getting streams ...");
	            ObjectOutputStream out = new ObjectOutputStream(  client.getOutputStream());
	            ObjectInputStream in = new ObjectInputStream(  client.getInputStream());
	            System.out.println("getting streams *done*");
	            Object a = null;
	            try {
	            	System.out.println("Waiting for object...");
	            	System.out.println(in.readInt());
	            	System.out.println(in.readInt());
	                a = in.readObject();
	                System.out.println("Got it: "+a);
	            } catch (ClassNotFoundException e) {
	                // TODO Auto-generated catch block
	                e.printStackTrace();
	            }
	            out.writeObject(a);
	            out.flush();
	            in.close();
	            out.close();
	        }
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
    }
 
    public static void main (String[] args) {
        KleinerServer server = new KleinerServer();
    }
}
```


```
import java.net.*;
import java.io.*;
 
public class Client {
    
    public Client()  {
    	try {
    	System.out.println("Connecting to server ...");
        Socket server = new Socket ("localhost",12344);
        System.out.println("Connecting to server ... *done*. Now getting streams ...");
        ObjectInputStream oIn = new ObjectInputStream( server.getInputStream());
        ObjectOutputStream oOut = new ObjectOutputStream( server.getOutputStream());
        System.out.println("Gettig streams *done*. Now sending some data ...");
        oOut.writeInt(5);
        oOut.writeInt(10);
        oOut.writeObject("test");
        oOut.flush();
        System.out.println("Sending data *done*");
        	System.out.println("Reading data ...");
			System.out.println(oIn.readObject());
			System.out.println("Reading data ...*done*");
		oOut.close();
		oIn.close();
        server.close();
    	} catch (ClassNotFoundException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
    }
 
    public static void main (String[] args) {
            Client client = new Client();
    }
}
```

Folgende Punkte waren/sind wichtig:

- Object*Streams "kommunizieren" intern. Ein BufferedStream kann da "stören" da er nicht alles sofort weiterreicht sondern puffert.
- Bei allen Streams solltest du auf einer Seite Dinge reinschreiben, und auf der anderen Seite genau in der Reihenfolge auch wieder auslesen. Du kannst nicht erst 2 Zahlen und dann ein Objekt senden, und auf der anderen Seite nur ein Objekt lesen. Die zwei Zahlen müssen zuerst aus dem Stream raus bevor du an das Objekt kommst
- Du solltest Ports m 5 Stelligen Bereich benutzen wenn's geht. Im Bereich unter 2000 ist alles schon ziemlich voll. 
- Hier und da ein Logoutput (jetzt noch mit Sysout's, später dann bitte mit anständigem Logger) erleichern die Fehlersuche ungemein


----------



## Ahnungslos10 (23. Nov 2009)

Ah das sieht ja schonmal super aus! Vielen Dank!

Mal schauen wie ich das im Ursprungsprogramm umsetzen kann!


----------

