object über socket senden
-
hallo
wie kann ich ein objekt über sockets versenden. habs so probiert, klappt a ber nicht ganz.
public void sendObject(Object obj){ try{ ObjectOutputStream obs = m_oSocket.getOutputStream(); // initialise Socket m_oSocket = new Socket(m_oAddr,m_iPortNr); obs.writeObject(obj); }catch (IOException e){ System.err.println(e.toString()); } }
-
hi schrieb:
hallo
wie kann ich ein objekt über sockets versenden. habs so probiert, klappt a ber nicht ganz.
Was meinst Du mit "nicht ganz"??
Und wieso holst Du Dir erst den OutputStream vom Socket, erstellst dann aber erst den Socket?!?!?
-
hallo
hab noch ein problem bekomme folgende exception wenn ich versuche mein object Level über den socket zu versenden.
fehler
java.io.StreamCorruptedException//aufruf der Methode SendObject wo ich ein level übergebe b.sendObject(level); . . . //definition der methodee sendObject public void sendObject(Object obj){ try{ ObjectOutputStream out; // initialise Socket m_oSocket = new Socket(m_oAddr,m_iPortNr); out = new ObjectOutputStream(m_oSocket.getOutputStream()); out.writeObject(obj); out.close(); m_oSocket.close(); }catch (IOException e){ System.err.println(e.toString()); }
-
Du weißt, daß Objekte, die Du durch irgendwelche Streams schickst, serialisierbar sein müssen...!??
-
also ich schicke jetzt von meinem client aus ein serialisiertes Objekt (Level) welches ich dan auf der Serverseite empfangen und abspeichern möchte. Jetzt wird aber immer die ClassNotFoundException geworfen. woran liegt das?
private Object reciveData(){ Object ret = null; try{ ObjectInputStream in; in = new ObjectInputStream(m_oSocket.getInputStream()); ret = in.readObject(); m_oSocket.close(); in.close(); }catch (IOException e){ System.err.println(e.toString()); } catch (ClassNotFoundException e) { System.err.println(e.toString()); } return ret; }
Ich wollte diese funktion so allgemein wie möglich halten, darum habe ich das Objekt, welches das Levelobjekt empfängt als Object deklariert. (bin mir aber nicht sicher ob man das darf.)
habe es auch schon so probiert, aber es kam die selbe excption
private Object reciveData(){ Level ret = null; try{ ObjectInputStream in; in = new ObjectInputStream(m_oSocket.getInputStream()); ret = (Level)in.readObject(); m_oSocket.close(); in.close(); }catch (IOException e){ System.err.println(e.toString()); } catch (ClassNotFoundException e) { System.err.println(e.toString()); } return ret; }
-
Sowohl der Sender als auch der Receiver müssen die Klasse Level.class bei sich tragen, und sie muß bei beiden identisch sein... (logisch)
-
beim zweiten beispiel habe ich die klasse level beim reciver implementiert aber er gibt mir dieselbe fehlermeldung aus.
-
jetzt habe ich das gesamte programm vom Client (das Spiel) auf den server kopiert. und jetzt bekomme ich eine Java.io.InvalidClassException ; local class not compatible: stream classdesc serialVerionUID -54361352036312026
ich kapiers echt nicht. es sollte doch nicht schwer sein. ein levelobjekt über auf einem anderen rechner abzuspeichern. was für alternativen gibt es denn sonst noch (mit möglichst wenig aufwand) um meine levels auf meinen server zu kriegen so das ich sie abspeichern und wieder laden kann??????????????????
-
Server und Client benötigen die selbe JVM und müssen über die selben Klassen verfügen. Wenn du dein Level-Objekt serialisierst musst du auch dafür sorgen, dass auf dem entfernten Rechner, zu dem du das Objekt schickst, auch die selbe Klasse (im CLASSPATH) zu finden ist. Nur so kann die dortige JVM ein Objekt dieser Klasse deserialisieren (instantiieren).
Deine Level-Klasse wäre darüber hinaus auch sehr interessant - vielleicht kannst du sie ja mal posten?
-
ich dachte immer java sei so kompatible. ich wusste nicht das die JVM gleich sein muss damit die serialisierung klappt. Ich hatte auf dem einten rechner den JBuilder9(jdk1.4) und auf dem anderen den Jbuilder8 (jdk1.3).
-
Da hast du schon recht. In den meisten Fällen wird dies auch klappen allerdings wissen wir hier ja nicht über den Aufbau deiner Level-Klasse bescheid. Vielleicht wurde eine Klassensignatur in irgendeiner Weise abgeändert? Um auf der sicheren Seite zu sein empfehle ich stets auf beiden Systemen gleiche Verhältnisse zu haben (bzw. zu schaffen).
-
ich dachte immer java sei so kompatible. ich wusste nicht das die JVM gleich sein muss damit die serialisierung klappt
Ich auch nicht, aber ich glaube auch nicht, das das so sein muss. AFAIK muss nur die signatur der Klasse ident sein _oder_ die SerialVersionUID übereinstimmen (die man ja von Hand festlegen kann)
Hier mal ein Zitat dazu aus dem Handbuch der Java-Programmierung:
Soll das Objekt später deserialisiert werden, so wird die in der Datei gespeicherte serialVersionUID mit der aktuellen serialVersionUID des geladenen .class-Files verglichen. Stimmen beide nicht überein, so gibt es eine Ausnahme des Typs InvalidClassException, und der Deserialisierungsvorgang bricht ab.