Przesyłanie obiektów w Socket

Przesyłanie obiektów w Socket
FL
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 9 lat
  • Postów:36
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:

Kopiuj
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

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
FL
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 9 lat
  • Postów:36
0

W interfejcie Zadanie jest extension Serializable...

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

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


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
airborn
extends ma w interfejsie Zadanie podobno, więc wszystko śmiga jak należy.
FL
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 9 lat
  • Postów:36
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:

Kopiuj
 
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:

Kopiuj
 
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

airborn
  • Rejestracja:prawie 16 lat
  • Ostatnio:prawie 7 lat
  • Postów:274
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

edytowany 3x, ostatnio: airborn
FL
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 9 lat
  • Postów:36
0

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

Kopiuj
 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();

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
FL
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 9 lat
  • Postów:36
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);

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
FL
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 9 lat
  • Postów:36
0

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

edytowany 1x, ostatnio: Fluke
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
FL
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 9 lat
  • Postów:36
0

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

Pozdrawiam.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.