Przesyłanie obiektów w Socket

0

Witam. Mam problem odnośnie przesyłania obiektów przez sieć. Problem polega w tedy gdy chcę przesłać obiekt, który zawiera pole. O to kod mojej klasy do przesłania:

package cls;

public class ZSortuj implements Zadanie {

    public String a = "asd";

    @Override
    public String get()
    {
        return a;
    }
}

Oczywiście w serwerze mam ObjectInputStream oraz w Kliencie mam ObjectOutputStream. Wszystko śmiga gdy usunę pole a oraz w metodzie get dam return "asd". Czytałem o RMI i też się uczę tego ale chciałbym wiedzieć w tym przypadku o co chodzi.

Dziękuję za pomoc i wiedzę
Pozdrawiam

0

Jak chcesz żeby coś się dało przesyłać w ten sposób to musisz dodać implements Serializable.

0

W interfejcie Zadanie jest extension Serializable...

0

No to pokaż jak te obiekty próbujesz przesyłać.

0

Powinno być implements Serializable. Masz extends Seralizable i nie ma błędów kompilacji?

0

A nie ma tak, że w interfejsach jak dziedziczysz inne interfejsy to musi być extends? Bo w klasie to rozumiem że ma być implements.

Tutaj po stronie klienta mam:

 
Socket socket = new Socket("localhost", 4444);
        ZSortuj z = new ZSortuj();
        ObjectOutputStream o = new ObjectOutputStream(socket.getOutputStream());
        z.a = "asd";
        o.writeObject(z);
        o.flush();

A tutaj po stronie serwera:

 
ServerSocket ss = new ServerSocket(4444);
            while(true) {
                Socket s = ss.accept();
                ObjectInputStream i = new ObjectInputStream(s.getInputStream());
                ZSortuj z = (ZSortuj)i.readObject();
            }

Dzięki za wszelkie wskazówki
Miłego dnia

0

Zaraz po tym, gdy tworzysz ObjectOutputStream wywołaj na nim metodę flush(). Dzięki temu wyślesz odpowiednie nagłówki i socket nie powinien się przyblokować. dokumentacja

0

Niestety nic to nie pomogło.... Zapomniałem w ogóle napisać o Exception.
Dostaję takie coś:

 java.net.SocketException: Connection reset
	at java.net.SocketInputStream.read(SocketInputStream.java:189)
	at java.net.SocketInputStream.read(SocketInputStream.java:121)
	at java.net.SocketInputStream.read(SocketInputStream.java:203)
	at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2266)
	at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2559)
	at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2569)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315)
	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1964)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1888)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
	at SerwerObliczeniowy.main(SerwerObliczeniowy.java:30)

a w lini 30 w pliku SerwerObliczeniowy mam: Zadanie z = (Zadanie)i.readObject();

0

A czy klient w ogóle działa wystarczająco długo? Bo ja klient ginie zanim serwer odbierze dane to nic nie wyślesz...

0

Brawooo :)

Właśnie o to chodziło. Działa jak należy. Tylko teraz pytanie: jak profesionalnie zrobić aby klient nie rozłączał się z serwerem dopóki nie prześle wszystkiego? Na razie wklepałem while(true) {} a przed tym dałem o.writeObject(z);

0

Możesz czekać aż serwer wyśle ack ;]

0

A co to ACK ?? :| Sorry za noob`ostwo...

0

Po prostu możesz zrobić tak że serwer ma odpisać klientowi jakąś wiadomość kiedy odbierze dane ;] Klient po wysłaniu obiektu będzie próbował odebrać wiadomość od serwera i w związku z tym będzie czekał aż serwer mu odpisze.

0

No i super. Dzięki wielkie za pomoc. Bardzo mi na tym zależało :)

Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1