# senden und empfangen von Objekten?



## SBehnen27 (21. Mrz 2005)

da das ganze eine aufgabe fürs studium ist, nehme ich den Code raus.


nach dem abgabetermin stelle cih den code gerne wieder rein, wenn danach gefragt wird.

die lösungen von einigen problemen habe ich ja weiter unten beschrieben.


----------



## SBehnen27 (21. Mrz 2005)

ich habe mal ncoh ein wenig rumgesucht betreffend object-versenden usw.

ergebnis: ich bin mir nicht mehr so sicher, ob es überhaput möglich ist ein array mit objekten einer klasse so zu versenden, wie oben beschrieben... kann mir da jemand wenigstens soweit auskunft geben?
muss ja nicht gleich source-code sein ^^ *fleht*


----------



## bambi (21. Mrz 2005)

Also laut API sollte das ja kein Problem sein...
Kannst Du mal die anderen Klassen posten? Bin zu faul mir das alles durchzulesen  :wink:  Ich teste das da mal und
schau' ob ich was find...


----------



## stev.glasow (21. Mrz 2005)

Las dir einfach mal die Exceptions ausgeben ;-)


----------



## SBehnen27 (21. Mrz 2005)

hm... also das mit den exceptions... da hätt ich auch mal drauf kommen können:


```
System: Server kann nicht senden -> Exception.java.io.NotSerializableException: sun.awt.image.ToolkitImage
System: Server kann nicht empfangen -> IOException.java.io.InvalidClassException: CardHeroes.Karte; local class incompatible: stream classdesc serialVersionUID = -8683094360508585683, local class serialVersionUID = 7039260118284666046
System: Server kann nicht senden -> Exception.java.io.NotSerializableException: sun.awt.image.ToolkitImage
System: Server kann nicht empfangen -> IOException.java.io.StreamCorruptedException
```


das mit dem bild... tja. keine ahnung.. mal schaun, obs reicht, die bilder mit null zu überschreiben... ma schaun.
der andere fehler sagt mir nichts.


----------



## ncsnk (21. Mrz 2005)

Server

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

class testobj implements Serializable
{
	public void bla()
	{
		System.out.println("huhu");
	}
	int testvar;
}

public class netservertest
{		
	public static void main(String[] args) throws IOException, ClassNotFoundException
	{
		ServerSocket ConnectionSocket=new ServerSocket(9999);
		Socket ClientConnection=ConnectionSocket.accept();
		ObjectInputStream StreamIn=new ObjectInputStream(ClientConnection.getInputStream());
		testobj[] a=new testobj[2];
		a[0]=new testobj();
		a[1]=new testobj();
		a[1].testvar=5;
		System.out.println(a[1].testvar);
		a=(testobj[])StreamIn.readObject();
		System.out.println(a[0].testvar);
		a[0].bla();
	}
}
```
Client

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

class testobj extends Object implements Serializable
{
	public void bla()
	{
		System.out.println("huhu");
	}
	int testvar;
}

public class netclienttest
{
	public static void main(String[] args) throws IOException
	{
		Socket ConnectionSocket=new Socket(Inet4Address.getLocalHost(),9999);
		ObjectOutputStream StreamOut=new ObjectOutputStream(ConnectionSocket.getOutputStream());
		testobj[] b=new testobj[2];
		b[0]=new testobj();
		b[1]=new testobj();
		b[0].testvar=1234;
		StreamOut.writeObject(b);
	}
}
```

da haste


----------



## SBehnen27 (21. Mrz 2005)

wen es interessiert:

wenn man ein objektarray versenden möchte, muss die klasse dieser objekte dieses haben:

```
implements Serializable
```

der fehler, mit dem ich ebend noch nichts anfangen konnte kam daher, dass ich am client eine leicht ältere version der klasse held genutzt habe, die ein weing anders aussah 

nachdem ich auf server und client identische klassen habe ist das auch kein problem mehr.

images problem habe ich wie folgt gelöst:
vor dem senden läuft eine schleife durch und setzt alle images auf null
das funktioniert prächtig.


das letzte Problem:


aus irgendeinem grund funktioniert das erste senden.
Danach kommt immer das gleiche array an... also interessierern die änderungen nicht mehr...

Ich habe den Code im ersten Posting mal aktualisiert.


----------



## SBehnen27 (22. Mrz 2005)

lösung:

der "fehler" lag im senden.
Es wird nur ein neues objekt gesendet, wenn es sich verändert hat (stichwort Hash-code)
Da sich aber nur die objekte ändern und nicht das array, welches ich verschicke, ändert sich auch der hash-code des arrays nicht.
ergo wird nicht gesendet.

die lösung, die ich nun nutze ist einfach nach dem senden ein 

```
ObjectOut.reset();
```

keine ahnung... vll. ist es ja auch möglich, ein senden des objektes zu erzwingen, egal, ob der hash code sich geändert hat, oder nicht.


----------

