除非流关闭,否则缓冲编写器不会发送文本



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

服务器是多线程的,当从套接字读取的第一行是"request"时,这个线程是用套接字和一个连接到套接字的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;
}}

你可能注意到我在bw流写"accept"之后关闭了它。

这是由于当流没有关闭时,客户端只是挂在那里,就好像它没有接收到任何输入。

客户端:

        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"))布尔检查(是的,流在服务器端被刷新)。

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

注意:当连接到错误的user/pass时(即当rs.next()返回false时),它确实将"decline"写入流并且客户端得到此值。

真的很困惑这个…

谢谢,迈克。

注意,write并不会写入换行符,您正在尝试读取整行。在换行前需要写一个换行符。

使用BufferedWriter.newLine()或将"n"附加到您写入的字符串

我将在这里留下一条建议:

当你想写字符到一个流,你应该总是使用OutputStreamWriterInputStreamReader与显式字符编码。我推荐使用UTF-8。

在编写

时,您的代码将使用平台默认编码进行读写。这将工作,直到有人在中国运行Windows客户端,有人在美国运行Linux服务器(这取决于你发送的内容,它可能会更快崩溃)。

相关内容

  • 没有找到相关文章

最新更新