java - 除非流关闭,否则 BufferedWriter 不会发送文本

标签 java database sockets stream bufferedwriter

我有一个与客户端通信的服务器。

服务器是多线程的,当从套接字读取的第一行是“请求”时,该线程是使用套接字和连接到套接字的 bufferedreader 创建的:

public class scriptComm implements Runnable {

private Socket sock;
private Socket sock2;
private Connection connection;
private BufferedReader reader;

@Override
public void run() {
    try {

        String name = reader.readLine();
        String password = reader.readLine();

        String line;
        connection = methods.connectToDatabase();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
        if (connection != null && name != null && password != null) {
            try {
                ResultSet rs = connection.createStatement().executeQuery(
                        "SELECT name, password, doupdate FROM accounts "
                        + "WHERE name = '" + name + "' AND doupdate = 'yes'"
                        + " AND password = '" + password + "'");
                if (rs.next()) {
                    methods.log("worked");
                    bw.write("accept");
                    bw.flush();
                    bw.close();
                    reader = new BufferedReader(new InputStreamReader(sock2.getInputStream()));
                    if ((line = reader.readLine()) != null) {
                        mainFrame.jTextArea1.append("line \n");
                        connection.createStatement().executeUpdate(
                                "UPDATE accounts SET updatetext = '" + line + "' "
                                + "WHERE name = '" + name + "'");
                    }else{
                        mainFrame.jTextArea1.append("No text received \n");
                    }
                } else {
                    bw.write("decline");
                    bw.flush();
                }
                bw.close();
                rs.close();
            } catch (SQLException ex) {
                methods.log("Error when executing statement in scriptComm");
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        } else {
            methods.log("missing values in scriptComm");

        }
    } catch (IOException ex) {
    }


}

public scriptComm(Socket sock, BufferedReader reader) {
    this.sock = sock;
    this.sock2 = sock;
    this.reader = reader;
}}

您可能会注意到,我在写入“accept”后关闭了 bw 流。

这是因为当流未关闭时,客户端只是卡在那里,就好像没有接收到任何输入一样。

客户端:

        try{
        String line;
        Socket sock = new Socket("myipaddresshere",portnumber); 
        PrintWriter writer = new PrintWriter(sock.getOutputStream());
        BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream()));
        writer.println("script");
        writer.flush();
        writer.println(jTextField1.getText());
        writer.flush();
        writer.println(jTextField2.getText());
        writer.flush();
        if ((reader.readLine()).equals("accept")) {
            writer.write("testing123");
            writer.flush();
            writer.close();
        } else {
            jTextArea1.append("fail");

        }
        reader.close();
        writer.close();
    }catch(IOException e){
        jTextArea1.append("Server not available. Please try again later.");
    }

当从服务器写入“accept”后流未关闭时,就好像客户端只是坐在 if(reader.readLine().equals("accept")) boolean 检查处(是的,流刷新服务器端)。

但是,当流也在服务器端关闭时,它会通过 boolean 检查并继续将行“testing123”写入流。服务器显然无法读取这一行,因为当 BufferedReader 关闭时套接字流也被关闭。正如您可能注意到的,我尝试通过简单地创建另一个名为 sock2 的变量来复制套接字,但似乎此连接也关闭了(有意义)。

注意:当使用错误的用户/密码连接时(即当 rs.next() 返回 false 时),它会向流中写入“拒绝”,并且客户端会收到此消息。

对这个问题真的很困惑..

谢谢, 迈克。

最佳答案

请注意,写入不会写入换行符,并且您正在尝试读取整行。在刷新之前您需要编写一个换行符。

Edither 使用 BufferedWriter。 newLine()或将 "\n" 附加到您编写的字符串中。

关于java - 除非流关闭,否则 BufferedWriter 不会发送文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6814846/

相关文章:

封装所有原语的 Java 对象——在 OutputStreams 中很有用

java - 高效的 Java 语言构造来检查字符串是否为 pangram?

java - java中的套接字服务器

java - 在单元测试中使用多个验证语句是否有值(value)?

java - 枚举在编译过程中是如何翻译的以及对象是如何创建的

database - er 图显示属性之间的关系

sql - 是否可以将一个表中的 SELECT 与另一表中的另一个 SELECT 连接到一行中?

database - 密码盐数据类型

android - 在不同网络上使用套接字通信

c# - 使用 Readline 后我的应用程序(服务器/客户端)被阻止