【问题标题】:Issues with writing and reading to/from a stream向/从流写入和读取的问题
【发布时间】: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


【解决方案1】:

固定:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2011-08-22
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多