Klient-Serwer - serwer nie usuwa klientów ;/

0

Mam problem z aplikacją klient-serwer. Jej zadanie jest takie: klient pisze do serwera: Jan Kowalski 234 a Serwer dodaje obiekt "Osoba" do wektora, i cały wektor wysyła klientowi. Jeśli klient wysle do serwera: WYJDZ Jan Kowalski 234 to serwer powinien usunąć tą osobę z wektora i wysłać wektor bez tej osoby do klienta ...

Nie działa mi usuwanie klientów, w ogóle serwer nie reaguje na komende 'wyjdz' :(

Pomoze ktoś? A, i jak ograniczyć liczbę klientów do 5?

package javaapplication48;

import java.io.*;
import java.util.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

public class Server {

    public static void main(String argv[]) throws IOException {

        List<Osoba> ls = new ArrayList<Osoba>();
        ServerSocket ss = new ServerSocket(1234);
        System.out.println("starting...");

        while (true) {

            new ServerConnection(ss.accept(), ls).start();
            System.out.println("new connection");

        }
    }
}

class ServerConnection extends Thread {

    Socket client;
    List<Osoba> ls;
    int i = 0;

    ServerConnection(Socket client, List<Osoba> ls) throws SocketException {
        this.client = client;
        this.ls = ls;
        setPriority(NORM_PRIORITY - 1);
    }

    @Override
    public void run() {

        boolean connection = true; // connection tester for current client

        try {
            while (connection) {

                BufferedReader in = new BufferedReader(
                        new InputStreamReader(client.getInputStream(), "UTF-8"));

                OutputStream out = client.getOutputStream();
                PrintWriter pout = new PrintWriter(
                        new OutputStreamWriter(out, "UTF-8"), true);
                String s;
                while ((s = in.readLine()) != null) {
                    s = s.trim();

                    if (s.startsWith("WYJDZ")) {
                        System.out.println("WYJDZ");
                        String tmp[] = s.split(" ");
                        if (ls.remove(new Osoba(tmp[1], tmp[2], tmp[3]))) {
                            System.out.println("USUNALEM");
                        }

                        Iterator it = ls.iterator();
                        while (it.hasNext()) {
                            String value = it.next().toString();
                            System.out.println(value);
                            pout.write(value);
                            pout.flush();
                        }
                    } else {
                        String tmp[] = s.split(" ");
                        if (ls.add(new Osoba(tmp[0], tmp[1], tmp[2]))) {
                            System.out.println("DODAŁEM");
                        }

                        Iterator it = ls.iterator();

                        while (it.hasNext()) {
                            String value = it.next().toString();
                            System.out.println(value);
                            pout.write(value);
                            pout.flush();
                        }

                    }

                }



            }
        } catch (IOException e) {
            System.out.println("I/O error " + e);
        }
    }
}

class Osoba {

    String imie;
    String nazwisko;
    String tel;

    public Osoba(String imie, String nazwisko, String tel) {
        this.imie = imie;
        this.nazwisko = nazwisko;
        this.tel = tel;
    }

    public String getnazwisko() {
        return nazwisko;
    }

    public void setnazwisko(String nazwisko) {
        this.nazwisko = nazwisko;
    }

    public String getimie() {
        return imie;
    }

    public void setimie(String imie) {
        this.imie = imie;
    }

    public String gettel() {
        return tel;
    }

    public void settel(String tel) {
        this.tel = tel;
    }

    //przygotowuje do wyslania obiekt Osoba
    @Override
    public String toString() {
        return imie + " " + tel + " " + nazwisko;
    }
}
0
1234_1234 napisał(a)

Nie działa mi usuwanie klientów, w ogóle serwer nie reaguje na komende 'wyjdz' :(

Reaguje, tylko usuwanie masz źle zrobione. Poczytaj jak działa metoda której używasz Collection.remove(Object)

0

No z tego co rozumiem, metoda ta usuwa obiekt, jeśli istnieje. A u mnie nie usuwa tego obiektu, bo jak pozniej mam to wyswietlanie nizej, to ten obiekt jest :/ niestety

0

Źle rozumiesz. Usuwa tylko takie same obiekty. Ponieważ Twój obiekt Client nie definiuje metody equals(Object) JVM sprawdza referencje obu obiektów, a te nigdy nie będą równe.

0

Czyli powinienem dodać do klasy Osoba coś takiego?

public boolean equals(Osoba o)
    {
     if (this.imie.equals(o.imie) && this.nazwisko.equals(o.nazwisko) && this.tel.equals(o.tel))
         return true;
     else
         return false;
    }
0

Dołożyłem metodę equals do klasy klient = niestety, nadal jest źle, osoba nie usuwa się. Moja klasa klienta to midlet, który wysyla zwykle stringi i nie wiem, jak do niego by mozna dodac to equals?

0

Spróbuj tak:

public boolean equals(Object ob)
{
     if (!(ob instanceof Osoba))
         return false;
     Osoba o = (Osoba)ob; 
     if (this.imie.equals(o.imie) && this.nazwisko.equals(o.nazwisko) && this.tel.equals(o.tel))
         return true;
     else
         return false;
}
0

@airborn: tak, tak, domyslilem sie.

@bogdans: wyglada na to, ze dziala, slicznie dzieki!:) nigdy bym do tego sam nie doszedl:)

A tak z ciekawosci: wyswietla mi w Netbeansie podkreslenie na zolto tego equals i pisze "Generate missing hashCode()" -> czy bez tego bedzie wszystko ok, co to robi?

0

@airborn: domyslilem sie, ale to i tak nie dzialalo:( dopiero rozwiazanie podane przez @bogdans pomoglo:)

0

@airborn: rzeczywiście, masz rację, to moje niedopatrzenie. Netbeans nic nie krzyczał, a jak chciałem dodać nad moją funkcją @Override to podkreślał na czerwono;/

A jeszcze dodatkowe pytanie mam - jak mogę ograniczyć ilość klientów, którzy łączą się z serwerem do 5? I jak będzie się chciał 6 kliet połączyć, to serwer mu napisze "nie ma miejsca" czy coś podobnego?

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