【发布时间】:2011-10-12 22:59:21
【问题描述】:
我知道我昨天发布了一个问题,可能看起来像我将要介绍给您的问题。然而,由于从上一个问题中吸取的教训,很可能不一样。
问题: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 文本不会更改为“等待脚本发送数据”。应该的。
请问您是否有任何疑问。
注意事项: 客户端应用程序中不会引发异常。 客户端应用程序打印出接受,表明它在我第一次请求时读取了 a 行。
任何帮助表示赞赏。真的,任何帮助。
迈克。
【问题讨论】:
-
不太可能有人会回答您的问题,因为您没有努力提供Short Self Contained Correct Example
-
我意识到这会让人们去 tl;dr,但老实说,我没有看到任何其他的方式来制定它。 ://
-
现在更新了问题。希望它更直接
标签: database sockets io bufferedreader