客户端/服务器用户名/密码认证
问题描述:
我正在处理客户端/服务器认证程序,但遇到了问题。客户端使服务器连接正常,但是一旦我输入密码和用户名,它就不会返回它是否是有效的用户名/密码。如果用户用正确的用户名/密码服务器登录应该返回“欢迎,用户名”,如果它无效,则返回“登录失败”。我查看了printwriter和bufferedreader文档,以确保我正确使用正确的方法在服务器/客户端之间传递文本。我尝试通过在服务器和客户端上打印用户名和密码来进行调试,以确保它们都是监听/写入,这似乎是因为它打印出正确的用户名/密码。有人能给我一些见解我的错在哪里吗?客户端/服务器用户名/密码认证
public class Connect {
private String USERNAME = "java";
private String PASSWORD = "java";
private int PORT = 9090;
private String HOSTNAME = "localhost";
public String getUsername(){
return this.USERNAME;
}
public String getPassword(){
return this.PASSWORD;
}
public int getPort(){
return this.PORT;
}
public String gethostName(){
return this.HOSTNAME;
}
}
import java.io.*;
import java.io.net.*;
public class Client {
private final String FILENAME = null;
Connect c = new Connect();
Socket socket;
BufferedReader read;
PrintWriter output;
public void startClient() throws UnknownHostException, IOException{
//Create socket connection
socket = new Socket(c.gethostName(), c.getPort());
//create printwriter for sending login to server
output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
//prompt for user name
String username = JOptionPane.showInputDialog(null, "Enter User Name:");
//send user name to server
output.println(username);
//prompt for password
String password = JOptionPane.showInputDialog(null, "Enter Password");
//send password to server
output.println(password);
output.flush();
//create Buffered reader for reading response from server
read = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//read response from server
String response = read.readLine();
System.out.println("This is the response: " + response);
//display response
JOptionPane.showMessageDialog(null, response);
}
public void fileInfo(){
}
public static void main(String args[]){
Client client = new Client();
try {
client.startClient();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.io.*;
import java.io.net.*;
public class Server {
private int currentTot;
ServerSocket serversocket;
Socket client;
int bytesRead;
Connect c = new Connect();
BufferedReader input;
PrintWriter output;
public void start() throws IOException{
System.out.println("Connection Starting on port:" + c.getPort());
//make connection to client on port specified
serversocket = new ServerSocket(c.getPort());
//accept connection from client
client = serversocket.accept();
System.out.println("Waiting for connection from client");
try {
logInfo();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void logInfo() throws Exception{
//open buffered reader for reading data from client
input = new BufferedReader(new InputStreamReader(client.getInputStream()));
String username = input.readLine();
System.out.println("SERVER SIDE" + username);
String password = input.readLine();
System.out.println("SERVER SIDE" + password);
//open printwriter for writing data to client
output = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
if(username.equals(c.getUsername()) &&password.equals(c.getPassword())){
output.println("Welcome, " + username);
}else{
output.println("Login Failed");
}
}
public static void main(String[] args){
Server server = new Server();
try {
server.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
答
您还需要刷新服务器的PrintWriter就像你正在做在客户端。
在你loginfo()
方法的末尾,
if(username.equals(c.getUsername()) &&password.equals(c.getPassword())){
output.println("Welcome, " + username);
}else{
output.println("Login Failed");
}
output.flush();
output.close();
+0
好极了!谢谢你解决了这个问题。 – javanewb
答
在代码中对明文字符串进行身份验证,使用条件来检查用户名和密码是有效的。
但是,如果你想假装我们是在现实世界中,对LDAP或至少一个加密属性文件验证...
Hashtable ldap = new Hashtable(11);
ldap.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
ldap.put(Context.PROVIDER_URL, "ldap://ldapserver:389/o=OU");
input = new BufferedReader(new InputStreamReader(client.getInputStream()));
String username = input.readLine();
String password = input.readLine();
ldap.put(Context.SECURITY_AUTHENTICATION, "tls");
ldap.put(Context.SECURITY_PRINCIPAL, "cn=" + username + ", ou=OU1, o=OU2");
ldap.put(Context.SECURITY_CREDENTIALS, password);
try {
DirContext context = new InitialDirContext(ldap);
context.addToEnvironment(Context.SECURITY_AUTHENTICATION, "none");
context.close();
} catch (Exception e) {
e.toString();
}
}
礼貌的Oracle文档的...
你能发布服务器和客户端代码吗?没有看到它们是如何实施的,我们无法真正做到。 – DeadChex
哦,我没有看到滚动条!我的不好 – DeadChex
服务器端在接收到用户名和密码时是否打印出来? – Jmrapp