Java:缓冲读取器和输出流

3
我有以下代码,我试图通过套接字发送文本数据。但是当我尝试通过 PrintWriter 发送时,我的客户端不做任何事情,并停留在 in.readLine() 处。然而,当我仅使用 OutputStream 并将其作为字节发送时,我的客户端在读取方面没有任何问题。我能否按照我的意愿执行此操作?
        out = new PrintWriter(sock.getOutputStream());
        in = new BufferedReader(new InputStreamReader(sock.getInputStream()));

        while (true) {
            System.out.println("SERVER-THREAD: IP "
                    + sock.getInetAddress().getHostAddress());
            out.write(marshall() + "\n");
            Thread.sleep(1000);
        }

//客户端

            in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            out = new PrintWriter(sock.getOutputStream());

            while (updateList) {
                System.out.println("Before");
                String inputip = in.readLine();
                System.out.println("CLIENT: " + inputip);
                //unmarshall(in);
                System.out.println("After");
                Thread.sleep(1000);
            }

1
为什么不给我们展示那些无法运行的代码,而非那些可以运行的代码呢? - JB Nizet
2个回答

5

PrintWriter缓冲要写入的数据,因此只有当缓冲区满时才会进行写入。你需要在这里调用flush。

out.flush();

是的。文档中说:如果启用了自动刷新,则仅在调用println、printf或format方法之一时才执行,而不是每次输出换行符时都执行。 - JB Nizet

3

当您执行readLine()时,它会等待直到读取整行内容。即一个新行。

您的send发送文本而没有换行符,因此接收方在等待不可能发生的东西。

更基本的问题是您正在混合文本和二进制,这更容易引起混淆而不是有用。

我建议您使用PrintWriter.println()编写文本,然后使用BufferedReader.readLine()读取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接