Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Lanwicki 26. 11. 2018, 13:43:20

Název: Java - sockets - poslání vnořených objektů
Přispěvatel: Lanwicki 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
Název: Re:Java - sockets - poslání vnořených objektů
Přispěvatel: listoper 26. 11. 2018, 14:29:18
Ukaz kod
Název: Re:Java - sockets - poslání vnořených objektů
Přispěvatel: Lanwicki 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());
    }
});
Název: Re:Java - sockets - poslání vnořených objektů
Přispěvatel: dfghfdhfgdh 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?
Název: Re:Java - sockets - poslání vnořených objektů
Přispěvatel: Lanwicki 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?
Název: Re:Java - sockets - poslání vnořených objektů
Přispěvatel: gll 26. 11. 2018, 15:42:15
není jednodušší posílat JSON?
Název: Re:Java - sockets - poslání vnořených objektů
Přispěvatel: listoper 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.
Název: Re:Java - sockets - poslání vnořených objektů
Přispěvatel: EHP 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.
Název: Re:Java - sockets - poslání vnořených objektů
Přispěvatel: Uuuu 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.
Název: Re:Java - sockets - poslání vnořených objektů
Přispěvatel: listoper 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.
Název: Re:Java - sockets - poslání vnořených objektů
Přispěvatel: Zdenek Henek nereg. 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/
Název: Re:Java - sockets - poslání vnořených objektů
Přispěvatel: Uuuu 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.
Název: Re:Java - sockets - poslání vnořených objektů
Přispěvatel: . 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.