学习Socket通信时PrintWriter中write和println的区别
2016-07-20 00:00
495 查看
摘要: 在学习Socket通信时,按照某些书中例子发现PrintWriter在使用println可以正常通信,而使用write却不行,十分费解。今天特意深挖一下,发现其实两个方法都是可以的,关键在于client端和server端的读写方式要保持一致。
我只贴关键代码,一般我们在写小demo时,用的是PrintWriter的println方法。
客户端:
服务端:
这样是可以正常工作的。而偏偏我们在写代码时,经常习惯于pw.write(String),因为主观意识上认为println是打印到控制台的。那么现在问题出现了,在使用了write之后
服务器端没有任何打印出来。更改之后的客户端代码为:
而服务器端不变,无法打印出nihao。那该如何是好呢?其实在客户端代码再加上newLine方法就可以了。因为服务器端在一行行读,所以客户端要相应的银行行写。
好了,通过上面我们看出来服务器端和客户端读写要保持一致就好了。那么我们现在改变服务器端,不让它一条条读,而是一次全部读出。我们客户端还用PrintWriter的write
但是不用newLine了,服务器端一次读出,不在使用readLine方法。
客户端:
这里面有个小坑,亲测发现即使在new PrintWriter时指定autoflush的,但是在使用write后,必须显示调用flush方法才行。
服务端:
我只贴关键代码,一般我们在写小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); }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Linux socket 初步
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序