# Serialialiserte Objekte übers Netzwerk verschicken



## psy_gast (21. Dez 2004)

Hi

Also, mein Plan ist es serlialisierte Objekte übers Netzwerk zu verschicken. Ich hab einen Client und einen Server.
Die Netzwerkverbindung ist ok, der Client connected zum Server, die Verbindung wird akzeptiert. Aber es kommt leider wie solls auch anders sein, zu Problemen. 


```
public class HalloIchBins extends    Thread
                     implements Serializable
{
public void run()
  {
  System.out.println("Hallo Server");
  }

}
```

Von dieser Klasse erstellt ich ein Objekt und schicke es mit einem writeObject zum Server. Beim Server kommt auch was an...aber wenn ich mir mit diesem Code

```
try
  	 {
           HalloIchBins MyObject = (HalloIchBins ) in.readObject();
           System.out.println("Objekt erhalten");
           MyObject.start();
        }
catch (Exception e)
       {
          System.out.println(e.getMessage);
        }
```

...den Stream auslese kommt es zu einer Fehlermeldung. Und zwar wird eine null - Exception geworfen. Direkt in der Zeile  von in.readObject

Client und Server liegen liegt beiden die HalloIchbins.class vor. 

Hat jemand ein Idee woran das liegen könnte ? Bin für jede noch so kleine Hilfe/Hints dankbar.


----------



## dotlens (21. Dez 2004)

übergibst du denn auch irgendwo das objekt?
die Exception bedeuted das das gelesene Objekt null ist. 

zeig mal den doce mit writeObject(); und den in dem du es über das Netzwerk schickst


----------



## meez (21. Dez 2004)

Zudem sind Threads nicht serialisierbar...


----------



## Bleiglanz (21. Dez 2004)

>>Direkt in der Zeile von in.readObject 

dann ist aber in==null


----------



## psy_gast (22. Dez 2004)

Servus

Die Threads hab ich jetzt rausgenommen, aber der Fehler tritt immer noch auf.

```
public class HalloIchBins implements Serializable
{
public void run()
  {
  System.out.println("Hallo Server");
  }

}
```

Also hier noch ein bissl code :

Mit diesem hier sollen die Objekte übers Netz verschickt werden. Gedanke ist der, dass irgendwann mehrere Objekte verschickt werden, welche alle die Oberklasse HalloIchBins haben :

```
public boolean sendeObjekte (HalloIchBins sendeObjekt)
{
try
	      {
	         out.writeObject(sendeObjekt);
	     }
	    catch (IOException e)
	        {
	        e.printStackTrace();
	        return false;
	        }
 return true;
}
```

Wenn ich in dem obigen Code ein sendeObjekt.run() ausführe ist das Objekt noch nicht null.


Die serverseitige Verbindung wurde wie folgt aufgebaut :

```
ServerSocket serverSocket = new ServerSocket(port);
		
acceptedSocket = serverSocket.accept();
in = new ObjectInputStream(acceptedSocket.getInputStream() );
out = new ObjectOutputStream(acceptedSocket.getOutputStream());
```

Der Client Code :

```
TransmitSocket = new Socket(server,port);
out = new ObjectOutputStream(TransmitSocket.getOutputStream() );
in = new ObjectInputStream(TransmitSocket.getInputStream() );
```


----------



## dotlens (22. Dez 2004)

versuch mal einen String zu schicken. klappt das? ansonsten hast du dein Prgramm irgendwie falsch aufgebaut....


----------



## psy_gast (22. Dez 2004)

einen String kann ich verschicken. das funktioniert einwandfrei.

das mit dem Objekt verschicken klappt auch, aber nur einmal. wenn ich es zum ersten mal schicke kommt auf dem Server die Ausgabe und wenn ich es ein zweites mal schicke, dann ist es null. 


```
public synchronized void run() 
  {
  
  Thread myThread = Thread.currentThread();
   	
  	 while(true)
  	     
            {
  	   try
  	    {
  	   
    
        HalloIchBinsMyObject = (HalloIchBins) in.readObject();
         System.out.println("Objekt erhalten");
         MyObject.run();
  	         
    	
            }
  	 catch (Exception e1) // geworfen von readObject
     {
     System.out.println(e1.getMessage());
     
     } 
     
}
```


----------



## dotlens (22. Dez 2004)

schickst du es denn auch mehrmals??
sobald du das Objekt gelsen hast ist es weg. dann musst du ein neues schicken...


----------



## psy_gast (22. Dez 2004)

ja ich schicke es auch mehrmals...wird über eine ActionEvent (ButtonClick) versendet...

was mir auch noch aufgefallen ist...also den Code den ich oben gepostet habe funktioniert so nicht : 


```
HalloIchBinsMyObject = (HalloIchBins) in.readObject();
System.out.println("Objekt erhalten");
MyObject.run();
```

wenn ich aber folgenden Code verwende, dann führt er das Objekt nur einmal aus..bei weiterem versenden kommt wieder die null


```
System.out.println(in.readUTF);
HalloIchBins MyObject = (HalloIchBins) in.readObject();
System.out.println("Objekt erhalten");
MyObject.run();
```

ich versteh die Welt nicht mehr...nur weil ein System.out davor steht, führt er es zumindest einmal aus....noch einmal ausführen, führt wieder zur null. 

wenn ich writeObject sage, schickt er das Objekt sofort oder wartet er bis erst ein Puffer gefüllt ist ?


----------



## Bleiglanz (22. Dez 2004)

du hast ja zwei programme laufen

den Abschicker

den Empfänger

bist du sicher, dass du noch alles im Griff hast?

Willst du

* in.readObject() mehrmals mit gleichem stream aufrufen?

* wenn ja, schreibt der writer mehrere Objekte raus?

* ODER bei jedem Start mit Accept einen neuen Socket aufmachen?

irgendwie wird man aus deinem Code nicht schlau...wie machst du das eigentlich beim Testen?

java Abschicker &

java Empfänger &

beide in Endlosschleife????


----------

