我只贴关键代码,一般我们在写小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);
}