Download source code tại đây: http://adf.ly/7390380/demo-pop3
Kiểu đăng nhập theo giao thức Pop3 được mô tả như sau:
Người dùng nhập tên đăng nhập sau đó nhập mật khẩu. Nếu mật khẩu không đúng người dùng có thể nhập lại mật khẩu hoặc tên đăng nhập mới. Server sẽ lấy tên đăng nhập lần cuối cùng và mật khẩu vừa nhập vào để login, nếu login thất bại người dùng lại có thể tiếp tục nhập lại mật khẩu hoặc tên đăng nhập mới.
Trước hết cần tạo lớp user để làm dữ liệu người dùng bao gồm:
public class User {
private String name;
private String pass;
public User(String name, String pass) {
this.name = name;
this.pass = pass;
}
trong lớp user này chúng ta có các phương thức:
@Override
public String toString() {
return name + ":" + pass;
}
public String getName() {
return name;
}
public String getPass() {
return pass;
}
để lấy user name, password và toString để in ra màn hình chuỗi name và pass.
Tiếp theo tạo lớp DAO dùng chứa danh sách user, lớp này đóng vai trò khởi tạo dữ liệu user ban đầu và các phương thức checkUserExists, login
public class Dao {
private ArrayList<User> listUser;
public Dao() {
listUser = new ArrayList<User>();
}
public void createData() {
listUser.add(new User("admin", "123"));
listUser.add(new User("user1", "user1"));
listUser.add(new User("user2", "user2"));
listUser.add(new User("user3", "user3"));
listUser.add(new User("user4", "user4"));
listUser.add(new User("user5", "user5"));
System.out.println(listUser);
}
public boolean checkUserExists(String username) {
for (User u : listUser) {
if (u.getName().equalsIgnoreCase(username)) {
return true;
}
}
return false;
}
public boolean login(String username, String pass) {
for (User u : listUser) {
if (u.getName().equalsIgnoreCase(username) && u.getPass().equals(pass)) {
return true;
}
}
return false;
}
}
Tạo lớp server. Các client sẽ kết nối thông qua cổng 12345
public class Server {
private static final int PORT = 12345;
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(PORT);
while (true) {
Socket socket = serverSocket.accept();
ServerProc serverProc = new ServerProc(socket);
serverProc.start();
}
}
}
Để server phục vụ được nhiều client cùng lúc, chúng ta tạo lớp serverProc extends Thread:
public class ServerProc extends Thread {
private Socket socket;
private BufferedReader netIn;
private PrintWriter netOut;
private String userName;
private Dao dao;
public ServerProc(Socket socket) throws IOException {
this.socket = socket;
this.netIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
this.netOut = new PrintWriter(socket.getOutputStream(), true);
this.dao = new Dao();
dao.createData();
netOut.println("[SERVER] Welcome!");
}
Phần protocol dưới đây là điểm mấu chốt để tạo cách đăng nhập kiểu giao thức POP3:
@Override
public void run() {
String command = null;
try {
while (true) {
command = netIn.readLine();
if (command.equalsIgnoreCase("quit")) {
break;
} else {
if (command.indexOf("user: ") == 0) {
String tempUsername = command.substring(6, command.length());
boolean exists = checkUserName(tempUsername);
if (exists) {
netOut.println("[SERVER] '" + tempUsername + "' ton tai. Co the nhap lai username hoac tiep tuc nhap mat khau.");
userName = tempUsername;
} else {
netOut.println("[SERVER] Ten dang nhap '" + tempUsername + "' khong ton tai");
userName = null;
}
} else {
if (command.indexOf("pass: ") == 0) {
String pass = command.substring(6, command.length());
boolean lg = login(pass);
if (lg) {
netOut.println("[SERVER] Dang nhap duoi ten '" + userName + "' thanh cong!");
} else {
netOut.println("[SERVER] Dang nhap that bai!");
}
} else {
netOut.println("[SERVER] Unknow your command!");
}
}
}
}
socket.close();
} catch (Exception e) {
}
}
private boolean checkUserName(String username) {
return dao.checkUserExists(username);
}
private boolean login(String pass) {
if (userName == null) {
return false;
} else {
return dao.login(userName, pass);
}
}
}
Lưu ý hàm run() là hàm được override lại của Thread
Để test bạn và RUN-->gõ cmd--> telnet 127.0.0.1 12345
|