Programm umschreiben von Pipes auf Sockets

Status
Nicht offen für weitere Antworten.
A

Ahnungslos10

Gast
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

Java:
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:
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:
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
 
A

Ahnungslos10

Gast
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 :(
 
T

tuxedo

Gast
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
 
A

Ahnungslos10

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

Java:
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?

Java:
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);
		}
	}
}
 
T

tuxedo

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

- Alex
 
A

Ahnungslos10

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

Java:
output.writeObject();

das Objekt kommt ja aus Zeile 17

Java:
Object a = oIn.readObject();

Oder hab ich da was falsch verstanden?
 
A

Ahnungslos10

Gast
hmpf schon wieder falsch :D So sollte das aussehen:

Java:
output.writeObject(a);

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

tuxedo

Gast
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
 
A

Ahnungslos10

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

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 :(
 
T

tuxedo

Gast
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
 
A

Ahnungslos10

Gast
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:

Java:
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:

Java:
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
 
T

tuxedo

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

Java:
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();
    }
}
Java:
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
 
A

Ahnungslos10

Gast
Ah das sieht ja schonmal super aus! Vielen Dank!

Mal schauen wie ich das im Ursprungsprogramm umsetzen kann!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
Aruetiise Socket Java Programm auf Server Netzwerkprogrammierung 3
G Programm unter anderer IP ausführen Netzwerkprogrammierung 6
T Socket Java Programm hängt sich auf bei dem versuch von einem Socket scanner Daten zu erhalten. Netzwerkprogrammierung 1
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
A Classpath Tomcat, Start von Programm aus Tomcat Container Netzwerkprogrammierung 1
M Java-Programm aus dem Web laden Netzwerkprogrammierung 3
E Eingabe (auf Internetseite) durch ein Programm machen lassen Netzwerkprogrammierung 19
T UDP Pakete empfangen ohne Programm zu blockieren Netzwerkprogrammierung 3
S HTTP Servlet als Instanzen im Programm starten Netzwerkprogrammierung 3
M Paktete abfangen und zu eigenem Programm umleiten - wie? Netzwerkprogrammierung 5
C Programm per Hompage ansprechen Netzwerkprogrammierung 4
T Download Programm - Download endet vorzeitig (bricht ab) Netzwerkprogrammierung 11
K Programm als Webservice laufen lassen Netzwerkprogrammierung 5
G ObjectInputStream hängt ganzes Programm auf... Netzwerkprogrammierung 7
C Vom Server Programm auf Client starten Netzwerkprogrammierung 2
J net send Popups abfangen und in eigenem Programm ausgeben. Netzwerkprogrammierung 12
M Befehle an externes Java-Programm senden Netzwerkprogrammierung 8
D client programm, passwortverschlüsselung Netzwerkprogrammierung 16
S HTTP Kleines Programm für den Routerneustart Netzwerkprogrammierung 3
M Java-Programm als Webserver erzeugt HTML Netzwerkprogrammierung 8
J Framework/ Muster für Chat-ähnliches Programm gesucht Netzwerkprogrammierung 2
N Datenaustausch zwischen Java-GUI und PHP-Programm über SOAP Netzwerkprogrammierung 19
1 Kommunikation mit externem Programm über TCP Netzwerkprogrammierung 2
B Server-Programm wird durch "read" beendet Netzwerkprogrammierung 8
P Wie gibt man einem GUI Programm ein Web interface? Netzwerkprogrammierung 5
P Java Programm als Dienst auf Server Netzwerkprogrammierung 11
T Theoriefrage : Programm-zugriffsrechte auf Netzlaufwerk Netzwerkprogrammierung 14
J Mit Java Anwendung ein (externes) Programm auf einem AIX Rechner starten Netzwerkprogrammierung 6
S Commons Net 2.0 und FTP in meinem Programm Netzwerkprogrammierung 4
lordcarlos Erstes TCP programm - output stream problem Netzwerkprogrammierung 2
A Probleme mit kleinem Netzwerk Programm Netzwerkprogrammierung 30
L RMI Programm beendet ohne Fehler sofort nach Start (Windows 2000) Netzwerkprogrammierung 7
L SSL Verbindung aber Server wird erst im Programm festgelegt Netzwerkprogrammierung 4
J programm zum autom. ausdruck einer webseite Netzwerkprogrammierung 2
A Probleme mit kleinem Messenger-Programm Netzwerkprogrammierung 4
L Programm in der RMIRegistry anmelden und benutzen (RMI) Netzwerkprogrammierung 4
H Webserver mit PHP als Java-Programm, gibt es schon so etwas? Netzwerkprogrammierung 12
A Java-Programm auf einem Server laufen lassen Netzwerkprogrammierung 9
F Chat Programm. Verständnisfrage while-Schleife Netzwerkprogrammierung 7
P Probleme bei Chat programm Netzwerkprogrammierung 2
M Log In Programm für Seiten Netzwerkprogrammierung 2
A download programm Netzwerkprogrammierung 2
G Einfaches Client-Server Programm (verbindungslos) Netzwerkprogrammierung 2
L RMI-Programm ausführen Netzwerkprogrammierung 6
J Java Programm für Upload von Dateien per HTTP Netzwerkprogrammierung 7
J Server soll Zugriff auf Java Programm ermöglichen Netzwerkprogrammierung 3
A JSP->Servlet->Programm (Ausführung) -> Servlet -&gt Netzwerkprogrammierung 2
L einfaches Programm zum herunterladen von Bildern Netzwerkprogrammierung 2
V probleme mit dem chat programm Netzwerkprogrammierung 4
N Hexcode an ein Programm senden. Netzwerkprogrammierung 4
R Mein FileTransfer Programm Netzwerkprogrammierung 12
T Kann man jeden Port für Programm verwenden? Netzwerkprogrammierung 2
B Wie Router einstellen für CLient-Server-Programm? Netzwerkprogrammierung 4
B Client-Server-Programm! Netzwerkprogrammierung 9
S P2P Programm Netzwerkprogrammierung 2
H E-Mail Programm Netzwerkprogrammierung 3
G Chat Programm - was ist los? Netzwerkprogrammierung 9
F Threads synchronisieren mit Pipes Netzwerkprogrammierung 3
R Pipes Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben