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();
}
}