我知道我昨天发布了一个问题,看起来就像我要呈现给你的那个。然而,由于从前一个问题中吸取了教训,因此很可能不一样。
问题:readLine()语句就位并等待输入。请阅读:
我有一台与客户端通信的服务器。使用的数据库是postgresql。 以下线程用于与客户端通信:
(出错的部分可能在for循环中)
服务器
public class mobileComm implements Runnable {
private Socket sock;
private Connection connection;
private BufferedReader br;
@Override
public void run() {
try {
String name = br.readLine();
String password = br.readLine();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(), "UTF8"));
if (methods.checkContinue(name, password)) {
methods.log(name + password);
connection = methods.connectToDatabase();
if (connection != null) {
String getQuery =
"SELECT name, password, updatetext FROM accounts "
+ "WHERE name = ? AND password= ?";
String setQuery =
"UPDATE accounts SET doupdate = 'yes' "
+ "WHERE name = ?'";
PreparedStatement getPS = connection.prepareStatement(getQuery);
PreparedStatement setPS = connection.prepareStatement(setQuery);
getPS.setString(1, name);
getPS.setString(2, password);
ResultSet rs = getPS.executeQuery();
if (rs.next() && rs.isLast()) {
boolean success = false;
bw.write("accept\n");
bw.flush();
setPS.setString(1, name);
setPS.executeUpdate();
String currentText = rs.getString("updatetext");
String updatedText;
for (int i = 0; i < 10; i++) {
if (!(updatedText = getPS.executeQuery().getString("updatetext")).equals(currentText)) {
bw.write("update\n");
bw.flush();
bw.write(updatedText + "\n");
bw.flush();
success = true;
break;
}
try {
Thread.sleep(250);
} catch (InterruptedException ex) {
}
}
if (!success) {
bw.write("noupdate\n");
bw.flush();
}
} else {
bw.write("decline\n");
bw.flush();
}
rs.close();
getPS.close();
setPS.close();
}
} else {
bw.write("wrong\n");
bw.flush();
}
bw.close();
br.close();
} catch (IOException ex) {
methods.log("Failed when creating brs and writers in mobileComm");
} catch (SQLException ex) {
methods.log("Error with sql in mobileComm thread");
}
}
public mobileComm(Socket sock, BufferedReader br) {
this.sock = sock;
this.br = br;
}
}
连接客户端的代码如下所示:
try {
String line;
Socket sock = new Socket("83.205.36.66", 80);
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(), "UTF8"));
BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream(), "UTF8"));
writer.write("request\n");
writer.write(jTextField1.getText() + "\n");
writer.write(jTextField2.getText() + "\n");
writer.flush();
if ((line = reader.readLine()).equals("accept")) {
System.out.print(line);
jTextArea1.setText("Waiting for script to send data.");
if ((line = reader.readLine()) != null) {
if (line.equals("update")) {
Scanner s = new Scanner(reader.readLine()).useDelimiter("\\s*::\\s*");
ArrayList<String> items = null;
while (s.hasNext()) {
items.add(s.next());
}
for (int i = 0; i < items.size(); i++) {
jTextArea1.setText("");
jTextArea1.append(items.get(i) + "\n");
}
} else if (line == "noupdate") {
jTextArea1.setText("No script running.");
}
} else {
jTextArea1.setText("Line is null");
}
} else if (line.equals("decline")) {
jTextArea1.setText("Incorrect user/pass combination");
} else if (line.equals("wrong")) {
jTextArea1.setText("Certain characters/strings were not allowed");
}
reader.close();
writer.close();
} catch (IOException e) {
jTextArea1.append("Server not available. Please try again later.");
}
实际的问题发生在
if ((line = reader.readLine()) != null) {
布尔检查。客户端应用程序的GUI只是冻结,就像在等待输入一样。
服务器线程中的for循环是因为它等待来自另一个线程的新数据库输入
我删除了整个for循环,只写了
bw.write("update\n);
bw.flush();
bw.bw.write("this::is::a::test\n);
bw.flush();
相反。 readLine()仍然使应用程序冻结,就像它正在等待输入一样。
那么为什么readLine()不会“执行”?
此外,jTextArea1文本不会更改为“等待脚本发送数据”。应该如此。
只要问你是否在想什么。
注意: 客户端应用程序中不会抛出任何异常。 客户端应用程序打印出“接受”,表示它在我第一次要求时读取一行。
任何帮助表示赞赏。真的,任何帮助。
麦克
答案 0 :(得分:1)
修正:
从数据库读取时从未在for循环中调用next(),因此实际上从来没有从数据库中读取任何内容。