我目前正在学习Java网络编程。在我的一个程序中,我只有一个EchoServer,它发送客户端的消息。但我在客户端中认识到Printwriter.write()
方法只是在我关闭编写器时发送,而.println()
方法工作正常。我也尝试过无论是否自动冲洗。
使用:
public static void main(String[] args) {
System.out.println("Simple Echo Client");
try{
System.out.println("Waiting for Connection ...");
InetAddress localAdress = InetAddress.getLocalHost();
try(Socket clientSocket = new Socket(localAdress,6000);
PrintWriter out =new PrintWriter(clientSocket.getOutputStream(),true);
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))){
System.out.println("Connected to Server");
Scanner scanner = new Scanner(System.in);
while(true){
System.out.print("Enter text: ");
String inputLine = scanner.nextLine();
if("quit".equals(inputLine)){
break;
}
out.println(inputLine);
String response = br.readLine();
System.out.println("Server response" + response);
}
}
}catch(IOException ex){
ex.printStackTrace();
}
}
不起作用:
public static void main(String[] args) {
System.out.println("Simple Echo Client");
try{
System.out.println("Waiting for Connection ...");
InetAddress localAdress = InetAddress.getLocalHost();
try(Socket clientSocket = new Socket(localAdress,6000);
PrintWriter out =new PrintWriter(clientSocket.getOutputStream(),true);
BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()))){
System.out.println("Connected to Server");
Scanner scanner = new Scanner(System.in);
while(true){
System.out.print("Enter text: ");
String inputLine = scanner.nextLine();
if("quit".equals(inputLine)){
break;
}
out.write(inputLine);
String response = br.readLine();
System.out.println("Server response" + response);
}
}
}catch(IOException ex){
ex.printStackTrace();
}
}
有人可以向我解释为什么会这样吗?
答案 0 :(得分:3)
当我关闭编写器时,Printwriter.write()方法只是在.println()方法正常工作时发送
这里似乎有两个问题,第一个与写作有关,第二个与阅读有关:
代码会创建一个带有自动换行功能的PrintWriter
。使用println
时,新行会导致写入程序刷新。如果在没有新行的情况下使用write
,则PrintWriter
不会刷新(您可以在out.flush
之后调用out.write
以强制刷新Writer
。< / p>
假设接收端正在使用Scanner.readLine()
,它需要一个新行或者等到它收到一行。 println
自动将新行附加到字符串的末尾,write
您必须明确发送新行out.write(line + "\n");
答案 1 :(得分:0)
是的,我以前绝对看过这个。如果您使用的是PrintWriter或其他具有autoflush的Writer,则无需调用flush()。但是,为了获得要发送的消息,您必须调用flush()来获取Writer / OutputStream中的内容以进行发送。