# Objekt über Socket übertragen



## Wagner (17. Dez 2007)

Guten Abend,

ich erlaube es mir einfach, hier meine Frage hineinzuschreiben *g*.

Also ich stand vor dem gleichen Problem, hab es dank der "Vertauschung" von Input und Output auch hinbekommen. Aber zu meinem eigentlichen Problem (wobei das Problem eher weniger mit Sockets etc. zu tun hat...eher mit den Basics von Java).

Also:

Ich hab bei mir im Client-Programm eine Innerclass (mit einem Attribut), in der Hauptklasse erstell ich ein Objekt von der Innerclass und schicke es an den Server.


```
out.writeObject(new Objekt());
```

Im Server-Programm "hol" ich mir dann das Objekt mit:


```
Object o = in.readObject();
```

Nun zu meiner Frage: Wie muss ich das machen, dass ich dann im Server-Programm mit dem wirklichen Objekt (vom Client) arbeiten kann? bzw. das Attribut verändern kann?

Zum Sinn des Programms: es gibt keinen...das ist nur ein Prototyp um mit dem Aufbau von Socket vertraut zu werden.

Und ja, ich kann mir gut vorstellen, dass Object nicht das Richtige ist. Aber mir fehlt einfach die richtige Spur grad.

Ich hoff ihr könnt erahnen, was mein Problem ist *g*

Schon im Vorraus vielen Dank für hilfreiche Antworten

mit freundlichen Grüßen
Wagner


----------



## Wildcard (17. Dez 2007)

*aufteil*


			
				Wagner hat gesagt.:
			
		

> ich erlaube es mir einfach, hier meine Frage hineinzuschreiben *g*.


Dann 'erlaube' es dir in Zukunft bitte nicht mehr und mach direkt einen neuen Thread :roll: 
Such mal nach dem Stichwort RMI.


----------



## Wagner (17. Dez 2007)

Oh tut mir vielmals Leid, eiglt sollte es eine Antwort werden zu einem bereits bestehenden Thread und nicht ein neuen Thread.


----------



## Wildcard (17. Dez 2007)

Das war es auch und ich hab einen neuen daraus gemacht, weil es in dem anderen nichts verloren hat.


----------



## Wagner (17. Dez 2007)

Ok, hast recht.

Also nun zum Thema...
du meintest was mit RMI, ich hab mir grad ein groben (wirklich sehr groben) Überblick verschafft. Soviel ich bis jetzt mitbekommen hab, kann ich via RMI Methoden von "anderen Rechnern" aufrufen. 

Aber mein Problem ist ja nicht, dass ich was aufrufen will von einem anderen Rechner, sondern ich möchte ein Objekt von Client an Server schicken und dieses Objekt auf dem Server bearbeiten. 

Ich hab aber leider keine Vorstellung wie. Ich bin mir 100% sicher, dass das "Object o = in.readObject();" nicht stimmen kann. Weil ich schicke ja ein "Objekt" und dort weis ich ja dann "Object" "Objekt" zu. (ich weiß, sehr verwirrend *g*)

Allerdings hab ich mich auch gefragt, dass der auf dem Server befindliche Code gar nicht wissen kann, dass das Objekt ein Attribut hat, was mich nun doch wieder auf RMI bringt.

Jetzt meine Frage, kann ich via RMI auch auf Attribute von anderen Rechner zugreifen? Oder soll ich das mit einer Methode verändern? (z.b. setAttribut(zahl)) 

Und wenn wir schon beim Thema RMI sind, hat mir jemand einen Link, auf dem die Syntax, der Aufbau, der Sinn klar und eindeutig auf deutsch erklärt wird?

mit freundlichen Güßen
Wagner


----------



## Wildcard (17. Dez 2007)

Du kannst das Objekt natürlich nicht direkt im Speicher auf einem anderen Rechner verändern, aber RMI versteckt diese Tatsache vor dir. Es fühlt sich also so an, als würden Server und Client das gleiche Objekt verwenden.
Schau dir dazu am besten die Java Insel an.


----------



## tuxedo (18. Dez 2007)

Sofern es dir wirklich nur um die Übertragung geht, lautet die Frage auf deine eingehende Antwort: "casten"


```
// Objekt senden
out.writeObject(new MeinObjekt(meinParameter1, meinParameter2));

// Objekt empfangen
Object o = in.readObject();
MeinObjekt meinObjekt = null;
if (o instanceof MeinObjekt)
        {
            meinObjekt = (MeinObjekt) o;
            // ab hier kannst du das gesendete und wieder empfangene Objekt wieder voll nutzen und auf Methoden und Parameter zugreifen
        }
```


----------



## Wagner1 (21. Dez 2007)

Also ich hab das jetzt so gemacht. 

Ich hab eine Innerclass in meinem Client-Programm gemacht (mit implements Serializable), dann erstell ich ein Objekt und sende das an das Server-Programm.

Aber dann weiß ich nicht weiter, denn laut deinem Code muss ja der Server die gleiche Klasse haben bzw. auch ein Objekt von der Klasse anlegen. Also hab ich ebenfalls eine Innerclass gemacht (gleicher Name, gleiche Attribute usw.).

Aber in die Abfrage "if (o instanceof MeinObjekt) " kommt es nicht rein, an was liegt das? Hab ich einen falschen Ansatz? wenn ja, würde ich mich um eine grobe Erklärung freuen.

mfg
Wagner


----------



## Wildcard (21. Dez 2007)

Die beiden Klassen haben nicht das geringste miteinander zu tun. Und wenn du sie drei mal gleich benennst. Es muss schon die selbe Klasse sein.


----------



## Wagner (24. Dez 2007)

Also erst mal frohe Weihnachten 

Ich nehm mir jetzt einfach mal viel Zeit um meine Fragen und Probleme zu schildern, denn ich muss das in den Weihnachtsferien hinbekommen für ein Projekt und auch eine Präsentation.

Also ich hab ein Projekt gemacht. In dem Projekt gibt es 3 Klassen:

- Client.java
- Server.java
- Objekt.java

Meine Vorstellung ist so:

Jeder Client schickt ein Objekt mit all seinen Daten an den Server, dieser speichert dann jedes Objekt von den Clienten in einem (Objekt)Array. Der Server soll dann anschließend alle Objekte an alle Clienten schicken. (Netzwerkspiel soll es werden). Und zum testen, will ich, dass der Server einfach mal die Attribute von den Objekten ändert (ohne jeglichen Sinn).

Nun zu meinem Code:

Einmal der *Server*:


```
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        
        ServerSocket server = new ServerSocket(4242);
        
        while (true) {
            
            Socket client = server.accept();
            
            ObjectInputStream in = new ObjectInputStream(client.getInputStream());
            ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream());

            Object o = in.readObject();
            Objekt mo = null;
            if (o instanceof Objekt) {
                mo = (Objekt) o;
                mo.ID = 2;
            }

            out.writeObject(mo);
            out.flush();
            
            out.close();
            in.close();
            client.close();
        }
    } 
}
```
...erklärt sich eiglt. von selbst.

*Client:*


```
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.Socket;

public class Client {
    
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        
        Socket server = new Socket("localhost", 4242 );
        
        ObjectOutputStream out = new ObjectOutputStream(server.getOutputStream());
        ObjectInputStream in = new ObjectInputStream(server.getInputStream());
        
        out.writeObject(new Objekt());
        out.flush();
        Object o = in.readObject();
        Objekt mo = null;
            if (o instanceof Objekt) {
                mo = (Objekt) o;
                System.out.println(mo.ID);
            }

        in.close();
        out.close();
        server.close();
    }
}
```

Und nun das sinnlose *Objekt*:


```
import java.io.Serializable;

public class Objekt implements Serializable{
    
    public int ID;

    public Objekt() {
    }
    
}
```


"Serializable" hab ich auch, weil ich es irgendwo gelesen hab, allerdings würde ich mich über eine Erklärung freuen, warum man das machen muss.

Was ich vllt. noch dazu sagen sollte, ich nehme ja ein "localhost" und starte die beiden Klassen einfach mit einer Befehlsbox.

Und nun zum eigentlich Problem: Wenn ich z.b. beim Server in die Abfrage "if(o instanceof Objekt)" ein System.out reinmache (um zu überprüfen, ob es wirklich rein kommt), kommt es einfach nicht rein und ich weiß nicht warum.

Also schonmal vielen Dank im Vorraus und ein schönes Fest

mit freundlichen Grüßen
Wagner


----------



## Wildcard (24. Dez 2007)

> "Serializable" hab ich auch, weil ich es irgendwo gelesen hab, allerdings würde ich mich über eine Erklärung freuen, warum man das machen muss.


Serializable ist ein Marker Interface, das angibt ob eine Klasse serialisiert werden darf, oder nicht.





> Und nun zum eigentlich Problem: Wenn ich z.b. beim Server in die Abfrage "if(o instanceof Objekt)" ein System.out reinmache (um zu überprüfen, ob es wirklich rein kommt), kommt es einfach nicht rein und ich weiß nicht warum.


Das habe ich dir oben bereits erklärt.


----------



## Wagner (25. Dez 2007)

> Die beiden Klassen haben nicht das geringste miteinander zu tun. Und wenn du sie drei mal gleich benennst. Es muss schon die selbe Klasse sein.



wie muss ich das verstehen? wie muss ich das im Code realisieren? (nur kurz andeuten) 
Weil ich versteh nicht, wie das zusammenhängen soll : /

schonmal vielen Dank im Vorraus

mit freundlichen Grüßen
Wagner 

p.s.: frohes Fest  (lasst euch 's schmecken)


----------



## Wagner (25. Dez 2007)

Edit:

Ich weiß zwar nicht genau, was ich verändert habe, aber nun funktioniert es 

Aber mir werden sicherlich noch einige Fragen aufkommen, deswegen würde ich mich freuen, wenn der Thread aufrecht erhalten wird 

gruß Wagner


----------



## Wildcard (26. Dez 2007)

> wie muss ich das verstehen? wie muss ich das im Code realisieren? (nur kurz andeuten)
> Weil ich versteh nicht, wie das zusammenhängen soll : /


Die Klasse des Objekts das du serialisierst, muss dem Server bekannt sein. Du kannst nicht einfach eine 'nachbauen' die sö ähnlich aussieht.


----------



## tuxedo (26. Dez 2007)

Zu deutsch:

GENAU DIE Class-File des Objektes das du "versenden" willst, muss dem Server vorliegen. 

;-)


----------

