Serwer TCP/IP - identyfikowanie klienta

0

Witam. Piszę wielowątkowy serwer TCP/IP w Javie i mam pewien problem. Chciałbym, żeby serwer jednorazowo nadawał klientowi ID, zapisywał je do pliku i w następnych sesjach według niego go identyfikował. Myślałem nad tym, żeby zrobić to przy użyciu Mapy o strukturze String String, gdzie przechowywałbym adres IP klienta i przypisany do niego identyfikator, ale nie wiem czy takie rozwiązanie jest w miarę optymalne. Nie wiem również, czy pisać to w klasie Serwer, czy utworzyc do tego celu nową klasę. Poniżej zamieszczam kod serwera, z góry dzięki za podpowiedz.


// klasa główna
public class Serwer {
    // ArrayList zaimplementowana dla wyjsciowego strumienia
    ArrayList outputStreams;

    // klasa obslugujaca klientów z wątkami
    public class ClientService implements Runnable {
        // atrybuty klasy - gniazdo oraz obiekt czytajacy
        BufferedReader reader;
        Socket socket;

        //konstuktor
        public ClientService(Socket clientSocket) {
            try {
                socket = clientSocket;
                // łaczymy strumien BufferedReader ze strumieniem InputStreamReader i strumieniem wejsciowym gniazda
                InputStreamReader isReader = new InputStreamReader(socket.getInputStream());
                reader = new BufferedReader(isReader);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        } // koniec konstruktora

        // start wątku
        public void run() {
            String message;
            try {
                while ((message = reader.readLine()) != null) {
                    System.out.println(getDate() + " " + message);
                    saveHistory(getDate(), message);
                }
            } catch (Exception ex) {
                //ex.printStackTrace();
                System.out.println("Connection closed");
            }

        } // koniec metody run()
    } // koniec klasy wewnętrznej


    public static void main(String[] args) {
        new Serwer().turnOn();
    }

    public void turnOn() {
        outputStreams = new ArrayList();
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(5000);

            while (true)
            {
                Socket clientSocket = serverSocket.accept();
                PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
                outputStreams.add(writer);
                Thread t = new Thread(new ClientService(clientSocket));
                t.start();
                String ipAdd = clientSocket.getRemoteSocketAddress().toString();
                System.out.println("Connection successful");
                File f = new File("history.txt");
                PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("history.txt",true)));
                checkFile(f);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    } // koniec metody turnOn


    //pobieranie aktualnej daty i godziny
    public String getDate()
    {
        Date currentDate = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        String dateString = dateFormat.format(currentDate);
        return dateString;
    }

    //sprawdzenie czy plik historii istnieje

    public void checkFile(File file) throws IOException {
        if (file.exists())
        {
            System.out.println("History file loaded");
        }
    }

    //zapis historii rozmowy do pliku

    public void saveHistory(String date, String msg) throws IOException {
        PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("history.txt",true)));
        out.println(date + " " + msg);
        out.close();
    }


}




 
1

Ja bym proponowal zrobic Ci po prostu logowanie Klienta i po tym identyfikowanie go. Klient sie rejestruje i przez to uzyskuje swoje unikalne ID.

Nie zapisuj takich rzeczy do pliku tylko pomysl o bazie danych - uprosci to znacznie obsluge takich uzytkownikow.

Nie wiem jak to jest w javie ale ja w obawie o zapchanie mojego serwera zmienilem obsluge uzytkownikow w watkach na kolejke zadan obslugiwana przez 10 watkow. Dziala rownie szybko a nie masz ryzyka, ze zabraknie Ci zasobow ;)

1

Nie wiem jak to jest w javie ale ja w obawie o zapchanie mojego serwera zmienilem obsluge uzytkownikow w watkach na kolejke zadan obslugiwana przez 10 watkow. Dziala rownie szybko a nie masz ryzyka, ze zabraknie Ci zasobow

dzięki NIO, obsługa połączenia może być wykonana w jednym wątku

0

identyfikujesz klienta po IP? To jest na 100% źle.
Albo twój protokół komunikacji przez TCP powinien uwzględniać identyfikacje klienta (jak np cookies w HTTP i SESSIONID), albo idziesz w stronę szyfrowania i żądasz od klienta certyfikatu "Client identity" (ekstremalne rozwiązanie, którego większość użytkowników nie rozumie).

1

Dziękuje wszystkim za odpowiedzi, utworzyłem identyfikacje poprzez logowanie i zapisywanie loginów i haseł do bazy SQLite :)

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