我知道我昨天發佈了一個問題,可能看起來像我將要呈現給您的那個。然而,由於從前一個問題中汲取教訓,這很可能不一樣。寫入和讀取流中的問題
問題:一個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循環,只是寫了
bw.write("update\n);
bw.flush();
bw.bw.write("this::is::a::test\n);
bw.flush();
相反。 readLine()仍然使應用程序凍結,就像它正在等待輸入一樣。
那麼爲什麼readLine()「不會執行」呢?
另外,jTextArea1文本不會更改爲「等待腳本發送數據」。正如它應該。
只要問你是否想知道任何事情。
備註: 在客戶端應用程序中不會引發異常。 客戶端應用程序打印出接受,表明它在我第一次詢問時讀取一行。
任何幫助表示讚賞。真的,任何幫助。
Mike。
任何人都不可能回答你的問題,因爲你沒有努力提供[Short Self Contained Correct Example](http://pscode.org/sscce.html) – Bohemian
我意識到這是讓人去tl;博士,但我真的沒有看到任何其他方式來制定它。:/ –
現在更新了問題。希望它更直接 –