Java - sockets - poslání vnořených objektů

Lanwicki

Java - sockets - poslání vnořených objektů
« kdy: 26. 11. 2018, 13:43:20 »
Ahoj,
je nějakým způsobem možné poslat přes Sockety a protokolem TCP objekt, který obsahuje vnořený objekt a ten vnořený objekt obsahuje List<>list ?

Př: posílám objekt Message a do konstruktoru - new Message(protocol, new Room(id, new Client()); s tím, že Room obsahuje uvnitř List<Client>. Jde mi to poslat ze serveru, ale na straně klienta mi to píše, že když dám message.getRoom() - tak mi háže ten to getRoom() null, jinak ten protokol se pošle v pořádku... Jde to vůbec, nebo to musím posílat po menším kusech?

Díky moc


Re:Java - sockets - poslání vnořených objektů
« Odpověď #1 kdy: 26. 11. 2018, 14:29:18 »
Ukaz kod

Lanwicki

Re:Java - sockets - poslání vnořených objektů
« Odpověď #2 kdy: 26. 11. 2018, 14:35:54 »
Server side:

Kód: [Vybrat]
private void getAllRooms(int id){
    for(Room room : rooms){
        for(Client client : room.getClientList()){
            if(client.getId() == id){
                try {
                    System.out.println("SENDIMG ROOM S Id" + room + " LIST " + room.getClientList());
                    out.writeObject(new Message(4, room));
                } catch (IOException e){
 
                }
            }
        }
    }
}
CLIENT side:

Kód: [Vybrat]
Thread readMessages = new Thread(() -> {
    Message ms;
    try {
        while (true) {
            ms = (Message) in.readObject();
            if(ms.getProtocol() == 25){
                onlineFriends.add(new Client(ms.getId(), ms.getName()));
            } else if(ms.getProtocol() == 4){
                System.out.println("READ PROTOCOL 4 " + ms);
                Room room = ms.getRoom();
                System.out.println("ROOM V READ MESSAGE " + room);
                rooms.add(room); // throws nullPointerException
            }
            else {
                receivedMessages.add(ms);
            }
        }
    } catch (IOException e){
        System.out.println("EXCEPTION IN READ THREAD");
        System.out.println(e.getStackTrace());
    } catch (ClassNotFoundException en){
        System.out.println(en.getStackTrace());
    }
});

dfghfdhfgdh

Re:Java - sockets - poslání vnořených objektů
« Odpověď #3 kdy: 26. 11. 2018, 15:17:55 »
do output streamu posilas jen Message object:
out.writeObject(new Message(4, room));

na prijimaci strane chces nacitat Message i Room, ale nevidim, ze bys nekde mel kod na WriteObject(new Room(25, room)) ?!!?

nezapomel jsi posilat Room do outputu?

Lanwicki

Re:Java - sockets - poslání vnořených objektů
« Odpověď #4 kdy: 26. 11. 2018, 15:29:37 »
do output streamu posilas jen Message object:
out.writeObject(new Message(4, room));

na prijimaci strane chces nacitat Message i Room, ale nevidim, ze bys nekde mel kod na WriteObject(new Room(25, room)) ?!!?

nezapomel jsi posilat Room do outputu?

no, ten Room je součástí Message, takže jsem myslel, že se to odešle jako součástí Message ten objekt...
Mám writeObject(25, room) a ten room se bere z toho for cyklu... a měl by obsahovat i list klientů...
Nebo to takto nefunguje a musím to poslat zvlášt?


gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Java - sockets - poslání vnořených objektů
« Odpověď #5 kdy: 26. 11. 2018, 15:42:15 »
není jednodušší posílat JSON?

Re:Java - sockets - poslání vnořených objektů
« Odpověď #6 kdy: 26. 11. 2018, 15:42:40 »
Kód: [Vybrat]
    rooms.add(room); // throws nullPointerException

Jestli to haze NPE tady tak je problem v inicializaci rooms a ne v socketech.

EHP

Re:Java - sockets - poslání vnořených objektů
« Odpověď #7 kdy: 26. 11. 2018, 20:49:16 »
Z toho kodu neni videt co jsou ty streamy (promenne in a out) vlastne zac. Predpokladam, ze jde o pokus pouzit klasickou javovou serializaci - na tu je pomerne pekny popis napr. na baeldung: https://www.baeldung.com/java-serialization Tuhle cestu rozhodne nedoporucuji - je to velke a pomale. Jak uz tady nekdo psal, udelej si serializaci napr. pres json/http (doporucuju jackson: https://github.com/FasterXML/jackson ) nebo muj oblibeny protobuf (https://developers.google.com/protocol-buffers/docs/javatutorial). Je to vice prace, ale rozhodne se vyplati.

Uuuu

Re:Java - sockets - poslání vnořených objektů
« Odpověď #8 kdy: 26. 11. 2018, 21:14:53 »
To je fuck jestli zkousel zakladni posilani objektu a nezabyval se setializaci,  pro ucebni ucely ok, ale ma chybu ze neco nezapisuje achce to cist, nebo naopak.
na kazde write musi byt jedno read.

Re:Java - sockets - poslání vnořených objektů
« Odpověď #9 kdy: 26. 11. 2018, 21:34:05 »
To je fuck jestli zkousel zakladni posilani objektu a nezabyval se setializaci,  pro ucebni ucely ok, ale ma chybu ze neco nezapisuje achce to cist, nebo naopak.
na kazde write musi byt jedno read.

Pise ze ten protokol z message precte. Takze message spravne prijme. Podle me  je v Message i ta Room, a problem neni v tom prenosu. Problem je podle az v tom zpracovani kde se snazi pridat tu ziskanou room do neinicializovaneho listu.

Zdenek Henek nereg.

Re:Java - sockets - poslání vnořených objektů
« Odpověď #10 kdy: 26. 11. 2018, 22:14:41 »
Ahoj,
je nějakým způsobem možné poslat přes Sockety a protokolem TCP objekt, který obsahuje vnořený objekt a ten vnořený objekt obsahuje List<>list ?

Př: posílám objekt Message a do konstruktoru - new Message(protocol, new Room(id, new Client()); s tím, že Room obsahuje uvnitř List<Client>. Jde mi to poslat ze serveru, ale na straně klienta mi to píše, že když dám message.getRoom() - tak mi háže ten to getRoom() null, jinak ten protokol se pošle v pořádku... Jde to vůbec, nebo to musím posílat po menším kusech?

Díky moc

Zkus se podivat na toto http://avro.apache.org/docs/current/

Uuuu

Re:Java - sockets - poslání vnořených objektů
« Odpověď #11 kdy: 26. 11. 2018, 22:54:55 »
Tak on tak tam ma message ms=in.read a pak zkousi ms.getroom, ale to by mel spise delat room = in.read, nacist room z proudu.

.

Re:Java - sockets - poslání vnořených objektů
« Odpověď #12 kdy: 27. 11. 2018, 00:01:43 »
Tak on tak tam ma message ms=in.read a pak zkousi ms.getroom, ale to by mel spise delat room = in.read, nacist room z proudu.
Prosím tě, běž si lehnout.