我正在尝试从客户端向服务器发送字符串,但它似乎没有从输入流中读取。
客户端
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) {}
}
它会读取我是否从客户端的输出流关闭流,但我试图从客户端向服务器发送多条消息。请有人帮忙
答案 0 :(得分:2)
您似乎认为每次在客户端调用flush()时,服务器都会知道它并且能够知道这是消息的结束。事实并非如此。 IOUtils.copy()
从字节流中读取所有内容。虽然尚未到达流端,但copy()
不会返回。
您可以将溪流视为长管的两侧。如果你在管子的末端倒了10桶水,那么你在另一边得到的就是连续的水流。
如果您需要多个单独的消息,那么您需要设计一个允许分离消息的协议,并在读取消息结束之前进行读取。例如,它可以基于分隔符。或者您可以发送消息的长度,然后发送消息本身,让服务器知道它必须读取多少字节才能获得下一条消息。