Java IOUtils复制和写入问题

Java IOUtils复制和写入问题,java,client-server,Java,Client Server,我试图从客户端向服务器发送字符串,但它似乎没有从输入流中读取 客户 Scanner scanner = new Scanner(System.in); Socket connection = new Socket("localhost", 13) OutputStream out = connection.getOutputStream(); while(true) { String message = scanner.nextLine(); IOUtils.write(mes

我试图从客户端向服务器发送字符串,但它似乎没有从输入流中读取

客户

Scanner scanner = new Scanner(System.in);
Socket connection = new Socket("localhost", 13)
OutputStream out = connection.getOutputStream();

while(true) {
    String message = scanner.nextLine();
    IOUtils.write(message, out, "UTF-8");
    out.flush();
}
服务器

ServerSocket server = new ServerSocket(localhost,13);~
Socket connection = server.accept();
InputStream in = connection.getInputStream();
StringWriter writer = new StringWriter();

while(true) {
    try {
        IOUtils.copy(in, writer);
        System.out.println(writer.toString());
    } catch(IOException io) {}
}

如果我从客户机的outputstream关闭流,但我试图从客户机向服务器发送多条消息,则会读取。有人能帮忙吗?

您似乎认为每次在客户端调用flush()时,服务器都会知道,并且能够知道消息到此结束。事实并非如此
IOUtils.copy()
读取字节流中的所有内容。尚未到达流结束时,
copy()
将不会返回

你可以把溪流看作一条长管子的两边。如果你把10桶水倒进管子末端的管子里,你在另一边得到的只是连续不断的水流


如果您需要多个单独的消息,那么您需要设计一个允许分离消息的协议,并一直读取到消息的末尾。例如,它可以基于分离器。或者,您可以先发送消息的长度,然后再发送消息本身,让服务器知道必须读取多少字节才能获得下一条消息。

OP希望发送行,其中每行都是一条消息。因此协议很简单:在客户端使用PrintWriter的println方法来写行,在服务器端使用BufferedReader的readLine()方法来读行。在这种情况下,消息的结尾是写入程序发送的EOL,并由readLine()方法检测。你应该自己去弄清楚。这就是你学习的方法。我刚刚更新了我上面的评论,解释了如何做。