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);
は、ユーザ・テーブルの管理管理者がある場合、私はチェックしたい場合は、しかし、クライアントが自動的にサーバーから切断し、サーバー側の例外がスローされます。クライアントが切断されています。
これは例外ではありません。例外は、そのエラーメッセージを印刷する原因となります。例外とスタックトレースを含めてください。 – f1sh
例外がキャッチされると、「Exception caught:client disconnected。」と表示され、クライアントを切断します。以下に示すように、実際のExceptionのスタックトレースを出力する必要があります。 – Berger
また、あなたのユーザ名とパスワードは、最終クエリで間違ってエスケープされます(引用符がありません)。これは、おそらく 'SQLException'です。エスケープする問題やSQLインジェクションを避けるために 'PreparedStatement'を見てください。 – Berger