Java套接字 - 为什么我需要一个PrintWriter才能使其工作?

时间:2016-02-17 11:59:22

标签: java sockets

我正在尝试用Java学习套接字编程,但不幸的是我遇到了一些我不理解的行为。我有一个非常简单的客户端程序,它连接到服务器套接字并发送一些回显的文本。所述客户端程序如下所示:

try(
    Socket socket = new Socket("127.0.0.1", 5001);
    OutputStreamWriter writer = new OutputStreamWriter(socket.getOutputStream());
    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
){
    String userInput = "";
    while (!userInput.toLowerCase().equals("quit")) {
        userInput = stdIn.readLine();
        writer.write(userInput);
        writer.flush();
        System.out.println("Server response: " + reader.readLine());    
    }
}
catch(Exception e) {e.printStackTrace();}

当我运行这个程序时,我输入的第一行被发送到服务器,但之后我可以输入尽可能多的行,没有任何内容被发送。我也从未看到System.out.println()行打印出来的任何内容。

但是,如果我为OutputStreamWriter切换PrintWriter,一切正常!这是代码PrintWriter

try(
    Socket socket = new Socket("127.0.0.1", 5001);
    PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
    BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
){
    String userInput = "";
    while (!userInput.toLowerCase().equals("quit")) {
        userInput = stdIn.readLine();
        writer.println(userInput);
        System.out.println("Server response: " + reader.readLine());    
    }
}
catch(Exception e) {e.printStackTrace();}

任何人都知道为什么上述两个程序中的第一个程序行为怪异而第二个程序有效?如果有人能告诉我用OutputStreamWriterPrintWriter写作之间的区别是什么,那么可能会告诉我发生了什么。

1 个答案:

答案 0 :(得分:2)

请注意,write()println()之间的区别在于println()在数据之后添加了换行符,write()则没有。

因此,如果您的服务器使用readLine()来使用write()与客户端接收数据,那么它可能会永远等待行结束而不接收它。

所以writer.write(userInput + "\n")可以解决问题。