Java networking - как навсегда запретить IP-адрес?
Я создаю программу, в которой пользователь входит на сервер с именем пользователя и паролем, известными только серверу. У них есть 4 попытки получить правильное имя пользователя и пароль. Если они не введут правильную регистрационную информацию за 4 попытки, сервер закроет соединение с клиентом.
Следующая часть программы, с которой мне нужна помощь, - это постоянный запрет пользователю подключаться для дальнейших попыток. Когда пользователь входит в систему в первый раз и получает все 4 попытки неправильно, его ip-адрес записывается в файл под названием "userIP.txt".
То, что я пытался сделать, это прочитать файл, и если он соответствует IP-адресу пользователя, они будут запрещены к использованию в программе. Это не работает - когда они возвращаются в программу, она позволяет им снова войти в систему.
Я знаю, что это может быть не лучший способ запретить пользователю доступ к серверу, но мое задание требует, чтобы я запретил его ip-адрес.
Есть идеи, как я могу это исправить?
Вот часть кода сервера:
Что я уже пробовал:
import java.lang.*; import java.io.*; import java.net.*; class Server { public static void main(String args[]) throws FileNotFoundException { String welcome = "Welcome! The server is now connected."; String login = "Enter username and password: "; String message; PrintWriter writer = new PrintWriter("userIP.txt"); try { //Detecting the localhost's ip address InetAddress localaddr = InetAddress.getLocalHost(); System.out.println("SERVER\n"); System.out.println ("Local hostnameIP: " + localaddr ); // Creating a server socket for connection ServerSocket srvr = new ServerSocket(1234); System.out.println("Waiting for connection on "+localaddr); // Accept incoming connection Socket skt = srvr.accept(); System.out.print("Server has connected!\n"); // get Input and Output streams PrintWriter out = new PrintWriter(skt.getOutputStream(), true); out.flush(); BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream())); BufferedReader log = new BufferedReader(new InputStreamReader(skt.getInputStream())); //read input for login System.out.print("Sending string: '" + welcome + "'\n"); out.println(welcome); InetAddress clientInetAddress = skt.getInetAddress(); String ip = clientInetAddress.getHostAddress(); //read file String checkIP = "userIP.txt"; String line = null; try { FileReader readFile = new FileReader (checkIP); BufferedReader br = new BufferedReader (readFile); while ((line = br.readLine())!= null) { System.out.println("reading file: " + line); if (line.equals(ip)) { System.out.println("IP MATCHES"); //closing server // out.println("You are banned. Server closing."); // out.close(); // skt.close(); // srvr.close(); } } br.close(); } catch (FileNotFoundException ex) { System.out.println("Unable to open file '" + checkIP + "'"); } catch(IOException ex) { System.out.println("Error reading file '" + checkIP + "'"); } //login attempts int tries = 4; while (tries>0) { out.println(login); //login String username = in.readLine(); System.out.println("Client's username: " + username); String password = in.readLine(); System.out.println("Client's password: " + password); if (username.equals("hello123") && password.equals("mypass")) { out.println("Correct login!"); System.out.println ("Client's IP Address: " + ip); tries=-1; } else { //if wrong login - give 3 more tries tries--; System.out.println("Number of tries left: " + tries); out.println("Try again. Login attempts left - " + tries); } } if (tries==0){ out.println("Wrong login - server closing"); out.close(); skt.close(); srvr.close(); //ban ip address permanently System.out.println("local: " + localaddr.getHostAddress()); System.out.println("client: " + ip); //write ip address to file writer.println(ip); writer.close(); }
Richard MacCutchan
Это должно быть простое дело, чтобы напечатать эти два значения, чтобы увидеть, почему они не совпадают.