A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 舒远 黑马帝   /  2012-9-11 16:05  /  1936 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 舒远 于 2012-9-11 19:53 编辑
  1. public class SocketClient {
  2.         public static void main(String[] args) throws Exception {
  3.                 Socket socket = new Socket("localhost", 11000);
  4.                 PrintWriter writer = new PrintWriter(socket.getOutputStream());               
  5.                 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));               
  6.                 BufferedReader readerIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  7.                 String line = null;               
  8.                 while ((line = reader.readLine()) != null) {
  9.                         if (line.equals("over"))
  10.                                 break;
  11.                         writer.println(line);
  12. //writer.flush();//如果这里被注释掉则无法收到服务端返回的消息
  13.    
  14.           String line1 = readerIn.readLine();
  15.                         System.out.println(line1);
  16.                 }
  17.                 reader.close();
  18.                 writer.close();
  19.                 socket.close();               
  20.         }
  21. }
  22. public class SocketServer {
  23. public static void main(String[] args) throws Exception {
  24.   ServerSocket serverSocket = new ServerSocket(11000);
  25.   while (true) {   
  26.    Socket socket = serverSocket.accept();
  27.    PrintWriter writer = new PrintWriter(socket.getOutputStream());
  28.    BufferedReader readerIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
  29.    String line = null;
  30.    while ((line = readerIn.readLine()) != null) {
  31.     System.out.println(line);
  32.     writer.println("你好,我已收到!");
  33.     //writer.flush();//如果这里注释掉则无法收到客户端的消息,而且一直处于阻塞状态
  34.    }
  35.    readerIn.close();
  36.    writer.close();
  37.    socket.close();
  38.   }
  39.   
  40. }
  41. }
复制代码
我使用的就是PrintWriter 对象来输出消息的,为什么还要用flush来刷新缓存才能读到数据?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 恭喜,26分了。

查看全部评分

4 个回复

倒序浏览
这是因为,PrintWriter这个流内部有字符数组缓冲区writeBuffer(这个缓冲区位于PrintWrite类的父类Write内部)。
当你调用这个流对象的write写入方法的时候,其实是把数据先写到了这个缓冲区里面了。如果你不刷新那就不会把数据写到你构造PrintWrite对象的那个底层流中的
在楼主的例子中就是 PrintWriter writer = new PrintWriter(socket.getOutputStream());
里面的socket.getOutputStream() 。
希望对楼主有帮助
回复 使用道具 举报
因为write方法和print方法只相当于把数据装入管道,flush相当于把管道数据倒入文件。所以必须在write或print之后,刷新。
回复 使用道具 举报
   void println()   通过写入行分隔符字符串终止当前行。 PrintWrite与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 println、printf 或 format 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。
回复 使用道具 举报
PrintWriter writer = new PrintWriter(socket.getOutputStream(),true);//使用这种方式创建打印输出流就能自动flush流了。
谢谢各位。!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马