您的位置:首页 > 编程语言 > Java开发

学习Socket通信时PrintWriter中write和println的区别

2016-07-20 00:00 495 查看
摘要: 在学习Socket通信时,按照某些书中例子发现PrintWriter在使用println可以正常通信,而使用write却不行,十分费解。今天特意深挖一下,发现其实两个方法都是可以的,关键在于client端和server端的读写方式要保持一致。

我只贴关键代码,一般我们在写小demo时,用的是PrintWriter的println方法。

客户端:

socket = new Socket("127.0.0.1", 8080);
PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
pw.println("nihao");


服务端:

br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String body = null;
while(true){
body = br.readLine();
if(body==null){
break;
}
System.out.println(body);
}


这样是可以正常工作的。而偏偏我们在写代码时,经常习惯于pw.write(String),因为主观意识上认为println是打印到控制台的。那么现在问题出现了,在使用了write之后

服务器端没有任何打印出来。更改之后的客户端代码为:

socket = new Socket("127.0.0.1", 8080);
PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
pw.write("nihao");

而服务器端不变,无法打印出nihao。那该如何是好呢?其实在客户端代码再加上newLine方法就可以了。因为服务器端在一行行读,所以客户端要相应的银行行写。

socket = new Socket("127.0.0.1", 8080);
PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);
pw.write("nihao");
pw.newLine();

好了,通过上面我们看出来服务器端和客户端读写要保持一致就好了。那么我们现在改变服务器端,不让它一条条读,而是一次全部读出。我们客户端还用PrintWriter的write

但是不用newLine了,服务器端一次读出,不在使用readLine方法。

客户端:

socket = new Socket("127.0.0.1", 8080);
pw = new PrintWriter(socket.getOutputStream(),true);
pw.write("nihaofdjskaljflkdajlkfdjaklfjdkajfkdjalkfjdlkajfkdsajlk");
pw.flush();

这里面有个小坑,亲测发现即使在new PrintWriter时指定autoflush的,但是在使用write后,必须显示调用flush方法才行。

服务端:

br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String body = null;
while(true){
char[] cbuf = new char[30];
int i = br.read(cbuf);
if(i<0){
break;
}
body = new String(cbuf);
System.out.println(body);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息