IOUtils复制和写问题

时间:2014-06-21 11:49:45

标签: 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(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) {}
}

它会读取我是否从客户端的输出流关闭流,但我试图从客户端向服务器发送多条消息。请有人帮忙

1 个答案:

答案 0 :(得分:2)

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

您可以将溪流视为长管的两侧。如果你在管子的末端倒了10桶水,那么你在另一边得到的就是连续的水流。

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