Проблемы с записью и чтением в/из потока

Я знаю, что вчера опубликовал проблему, которая может выглядеть как та, которую я собираюсь представить вам. Однако, скорее всего, это не то же самое из-за уроков, извлеченных из предыдущего вопроса.

ПРОБЛЕМА: оператор 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 в потоке сервера связан с ожиданием ввода новой базы данных из другого потока.

Я удалил весь цикл for и просто написал

bw.write("update\n);
bw.flush();
bw.bw.write("this::is::a::test\n);
bw.flush();

Вместо. readLine() по-прежнему заставляет приложение зависать, как будто оно ожидает ввода.

Почему функция readLine() не "выполняется"?

Кроме того, текст jTextArea1 не меняется на «Ожидание отправки скриптом данных». как это должно.

Просто спросите, если вас что-то интересует.

Примечания: в клиентском приложении исключений не возникает. клиентское приложение распечатывает accept, показывая, что оно читает строку a в первый раз, когда я прошу об этом.

Любая помощь приветствуется. Действительно, любая помощь.

Майк.


person Mike Haye    schedule 25.07.2011    source источник


Ответы (1)


Исправлено:

никогда не вызывал next() в цикле for при чтении из базы данных, поэтому никогда ничего не читал из базы данных.

person Mike Haye    schedule 27.07.2011