2015-07-10 90 views
2

我正在处理客户端/服务器认证程序,但遇到了问题。客户端使服务器连接正常,但是一旦我输入密码和用户名,它就不会返回它是否是有效的用户名/密码。如果用户用正确的用户名/密码服务器登录应该返回“欢迎,用户名”,如果它无效,则返回“登录失败”。我查看了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(); 
     } 
    }  
} 
+1

你能发布服务器和客户端代码吗?没有看到它们是如何实施的,我们无法真正做到。 – DeadChex

+0

哦,我没有看到滚动条!我的不好 – DeadChex

+0

服务器端在接收到用户名和密码时是否打印出来? – Jmrapp

回答

4

您还需要刷新服务器的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

0

在代码中对明文字符串进行身份验证,使用条件来检查用户名和密码是有效的。

但是,如果你想假装我们是在现实世界中,对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文档的...

相关问题