Я знаю, что вчера опубликовал проблему, которая может выглядеть так, как будто я собираюсь представить ее вам.Однако, скорее всего, это не то же самое из-за уроков, извлеченных из предыдущего вопроса.
ПРОБЛЕМА : оператор 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) {
Булева проверка.Графический интерфейс клиентского приложения просто зависает, как будто он ожидает ввода.
Цикл for в потоке сервера состоит в том, что он ожидает ввода новой базы данных из другого потока
Я удалил все дляцикл и просто написал
bw.write("update\n);
bw.flush();
bw.bw.write("this::is::a::test\n);
bw.flush();
Вместо.ReadLine () по-прежнему заставляет приложение зависать, как будто оно ожидает ввода ..
Так почему же readLine () не "выполнится"?
Кроме того, текст jTextArea1 не меняется на «Ожидание сценария для отправки данных».
Просто спросите, не интересуетесь ли вы чем-нибудь.
Примечания: в клиентском приложении не возникает исключений.клиентское приложение печатает «Принять», показывая, что оно читает строку в первый раз, когда я его спрашиваю.
Любая помощь приветствуется.Действительно, любая помощь.
Майк.