Kradzież przesyłanych danych - klient/serwer

0

Dobry wieczór.
Mam problem z "kradzieżą" danych przy przesyłaniu między klientem a serwerem. Mam prostą listę z userami ONLINE po stronie klienta. Odpalam sobie serwer i 2 klientów. Pierwszemu każę się połączyć z serwerem. Serwer pokazuje że wysyła dane o 1 userze online - zgadza się. Po stronie klienta pokazuje że tylko on jest dostępny. 1 klient połączony - 1 online - OK

Teraz odpalam klienta numer 2. Łączę się z serwerem i po stronie klienta nr2 pokazuje że jest dwóch online (zgadza się) ale za to klient 1 nadal widzi tylko siebie.

Oto część programu, która odpowiada za wysyłanie i odbieranie:

Po stronie serwera - wysyłacz statusu (m. in.)

private void rewrite() {
        online.clear();
        for(int key : handlerMap.keySet()) {
            online.put(handlerMap.get(key).getId(), handlerMap.get(key).getNickname());    
        }     
    }
    
    public void run() {
        try {
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            container = new MsgContainer();
            list = new OnlineList();
            
            while(!interrupt) {
                rewrite();
                list.setOnlineList(online); //zapisujemy mape z 2 klientami do wyslania. mapa sklada sie z ID klienta i jego NICKU
                container.setMessage(message); //dodatkowe dane do wyslania - nie istotne
                container.setList(list);
                System.out.println("klucz - "+id+" ----------------" +container.getList().getOnlineList().size());  //tuz przed wyslaniem sprawdzam czy na pewno //wysylani sa obaj klienci, wszystko sie zgadza, DO OBU KLIENTOW PO STRONIE SERWERA wysylana jest ta sama liczba online - 2
                oos.writeObject(container); //wysylamy obiekt
                message = null;
                Thread.sleep(100);
            }
            oos.close();
        } 
        catch(InterruptedException e) { System.out.println(e); }
        catch(IOException e) { System.out.println(e); } 
        
        threadOnlineList.interrupt();
    }

Po stronie klienta odbieramy:

    public void run() {
        try {
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            while(!interrupt) {
                if(ois.readObject() != null) {
                    MsgContainer container = (MsgContainer) ois.readObject(); //odbieramy obiekt
                    updateList(container.getList().getOnlineList());
                    System.out.println(container.getList().getOnlineList().size()); //tu juz pokazuje dla jednego klienta ze mapa zawiera
                    //tyko jednego klienta, natomiast u drugiego ze dwoch. Czyli po drodze jest jeden gubiony 
                }
                Thread.sleep(100);
            }
            ois.close();
        } 
        catch(IOException e) { System.out.println(e); }
        catch(InterruptedException e) { System.out.println(e); }
        catch(ClassNotFoundException e) { System.out.println(e); }
    }

//EDIT Dodam że probowalem przesłać po prostu liczbę online (bez juz szczegolow, kto z jakim ID itd.) i przesyła dobrze. To mnie martwi bo wychodzi na to że to jakiś błąd JAVY ?

0

A to ciekawe, wiec powiedz mi jakim cudem obaj widza zmiane jesli chodzi o liczbe ONLINE? Serwer jest napisany pod wielu klientów, każdy ma swój

Socket socket = server.accept()

Obaj widza ze sa 2 (a ta liczba 2 to po prostu wielkosc przesylanej mapy). Najpierw jak jest jeden podlaczony to wyswietla sie ze jest jeden a jak podlaczy sie drugi to dla obu wyswietla sie ze jest 2ch. Wiec skoro przeslalo do obu dobrze Integera to czemu nie moze wyslac Obiektu?

PS. Nie ruszają mnie Twoje prowokacje :P

2

Przed wysłaniem nowej wersji obiektu musisz wywołać metodę reset().

0

I oto chodziło! Dziękuję! Takiej odpowiedzi oczekiwałem a nie biadolenia że ofc mój kod jest źle a ja powinienem rzucić naukę programowania :P Dzięki jeszcze raz.

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