2016-05-04 7 views
2

私は、複数のクライアントがMySQLテーブルからデータを取得する1台のサーバに接続するシナリオを持っています。この場合、id、username、およびpasswordカラムを持つユーザテーブルです。 (コードの一部)JavaスレッドでMySQLからデータを取り出すには?

public void run() { 
    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     PrintWriter writer = new PrintWriter(client.getOutputStream(), true); 
     writer.println("[type 'bye' to disconnect]"); 
     String commandType = null, username = null, password = null; 
     while (true) { 

      String line = reader.readLine(); 
      String[] parts = line.split(" "); 

      for (int i = 0; i < parts.length; i++) { 
       commandType = parts[0]; 
       username = parts[1]; 
       password = parts[2]; 
      } 

      if (commandType.equals("!login")) { 
       if (db.login(username, password)) { 
        writer.println("Welcome"); 

       } else { 
        writer.println("Wrong credentials"); 
       } 
      } 

      if (line.trim().equals("bye")) { 
       writer.println("bye!"); 
       break; 
      } 

     } 
    } catch (Exception e) { 
     System.err.println("Exception caught: client disconnected."); 
    } finally { 
     try { 
      client.close(); 
     } catch (Exception e) { 
      ; 
     } 
    } 
} 

そしてDBManagerのクラスでは、私がログインしている方法

Server.java:サーバー側で がコードを以下れる

public synchronized boolean login(String username, String password) throws SQLException { 
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost/database", "root", "root"); 

    Statement st = con.createStatement(); 

    String sql = "SELECT username, password FROM users WHERE username = " + username + " AND password = " 
      + password; 

    ResultSet rs = st.executeQuery(sql); 

    while (rs.next()) { 

     String uname, pass; 
     uname = rs.getString("username"); 
     pass = rs.getString("password"); 

     if (username.equals(uname) && password.equals(pass)) { 
      return true; 
     } 

    } 
    rs.close(); 
    st.close(); 
    con.close(); 
    return false; 
} 

ので、クライアントが送信した場合:

!login admin admin 

私はコマンドタイプ、ユーザー名、パスワードを

writer.println("Client sends commandType: " + commandType + " , username: " + username + " password: " + password); 
は、ユーザ・テーブルの管理管理者がある場合、私はチェックしたい場合は、しかし、クライアントが自動的にサーバーから切断し、サーバー側の例外がスローされます。クライアントが切断されています。

+0

これは例外ではありません。例外は、そのエラーメッセージを印刷する原因となります。例外とスタックトレースを含めてください。 – f1sh

+0

例外がキャッチされると、「Exception caught:client disconnected。」と表示され、クライアントを切断します。以下に示すように、実際のExceptionのスタックトレースを出力する必要があります。 – Berger

+0

また、あなたのユーザ名とパスワードは、最終クエリで間違ってエスケープされます(引用符がありません)。これは、おそらく 'SQLException'です。エスケープする問題やSQLインジェクションを避けるために 'PreparedStatement'を見てください。 – Berger

答えて

1

クライアントはシステムエラーメッセージのように聞こえますが、それは違います。 あなたが作り出すものです。この代わりに:

} catch (Exception e) { 
    System.err.println("Exception caught: client disconnected."); 
} finally { 

本当のエラーが何であるかを紹介します

} catch (Exception e) { 
    e.printStackTrace(); 
} finally { 

を行います。

関連する問題