写入和读取流的问题

时间:2011-07-25 21:43:16

标签: database sockets io bufferedreader

我知道我昨天发布了一个问题,看起来就像我要呈现给你的那个。然而,由于从前一个问题中吸取了教训,因此很可能不一样。

问题: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文本不会更改为“等待脚本发送数据”。应该如此。

只要问你是否在想什么。

注意: 客户端应用程序中不会抛出任何异常。 客户端应用程序打印出“接受”,表示它在我第一次要求时读取一行。

任何帮助表示赞赏。真的,任何帮助。

麦克

1 个答案:

答案 0 :(得分:1)

修正:

从数据库读取时从未在for循环中调用next(),因此实际上从来没有从数据库中读取任何内容。