【发布时间】:2016-08-30 03:29:00
【问题描述】:
我有一个场景,多个客户端连接到一个从 MySQL 表中检索数据的服务器。在这种情况下,它是包含 id、用户名和密码列的用户表。 在服务器端是以下代码:
Server.java(部分代码)
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 类中我有登录方法:
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);
,但是如果我想检查用户表中是否有 admin admin,客户端会自动断开与服务器的连接,并在服务器端抛出异常:客户端已断开连接。
【问题讨论】:
-
这也不例外。异常是导致打印该错误消息的原因。请包括异常和堆栈跟踪。
-
当捕获到异常时,您只需打印“异常捕获:客户端已断开连接。”,然后断开客户端连接。您应该打印真正异常的堆栈跟踪,如下所示。
-
另外,您的用户名和密码将在最终查询中被错误地转义(缺少引号),这很可能是
SQLException。看看PreparedStatement,避免转义问题和SQL注入。 -
是的,这就是问题所在。不包括堆栈跟踪,问题出在未导入的 mysql jdbc 驱动程序上。再次感谢!
标签: java mysql multithreading