Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何';清洁';输入流而不关闭它?_Java_Sockets_Inputstream - Fatal编程技术网

Java 如何';清洁';输入流而不关闭它?

Java 如何';清洁';输入流而不关闭它?,java,sockets,inputstream,Java,Sockets,Inputstream,客户端代码片段。基本上,它读取标准输入并将消息发送到服务器 public static void main(String[] args) { try (Socket socket = new Socket("localhost", 1200)) { OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.US_ASCII);

客户端代码片段。基本上,它读取标准输入并将消息发送到服务器

public static void main(String[] args) {

    try (Socket socket = new Socket("localhost", 1200)) {
        OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.US_ASCII);

        Scanner scanner = new Scanner(System.in);
        for (String msg = scanner.nextLine(); !msg.equals("end"); msg = scanner.nextLine()) {
            writer.write(msg + "\n");
            writer.flush();
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}
服务器代码段。从流打印消息

 public void run() {

    try (InputStreamReader reader = new InputStreamReader(this.socket.getInputStream(), StandardCharsets
            .US_ASCII)) {

        StringBuilder builder = new StringBuilder();

        for (int c = reader.read(); c != -1; c = reader.read()) {

            builder.append((char) c);
            if ((char) c == '\n')
                System.out.print(builder);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
}
来自客户的输入:

Text1
Text2
服务器输出:

Text1
Text1
Text2
我面临的问题是,服务器不仅打印接收到的消息,而且打印之前的所有消息


问题:如何在不关闭输入流的情况下重置“clean”
InputStream
。如果这是不可能的,那么首选的解决方案是什么?

您不需要“清理”流——您只需要在每行之后重置缓冲区。使用以下命令尝试以下操作:

另一方面,我强烈建议不要手动阅读这样的行。考虑在客户端代码中使用类似的方法,或者使用.< /P>
您不需要“清理”流——只需要在每行之后重置缓冲区。使用以下命令尝试以下操作:

另一方面,我强烈建议不要手动阅读这样的行。考虑在客户端代码中使用类似的方法,或者使用.< /P> 愚蠢的错误:)。TNX严重错误:)。Tnx
if (c == '\n') {
  System.out.print(builder.toString());
  builder.setLength(0);
}
try (final BufferedReader reader
         = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.US_ASCII))) {
  for (String line = reader.readLine(); line != null; line = reader.readLine()) {
    System.out.println(line);
  }
} catch (final IOException ex) {
  ex.printStackTrace();
}