黑马程序员技术交流社区

标题: 为什么会阻塞,求详解 [打印本页]

作者: 吴玉辉    时间: 2012-4-15 03:20
标题: 为什么会阻塞,求详解
  1. import java.io.*;
  2. import java.net.*;

  3. class  TextClient
  4. {
  5.         public static void main(String[] args) throws Exception
  6.         {
  7.                 Socket s = new Socket("169.254.115.35",10006);

  8.                 BufferedReader bufr =
  9.                         new BufferedReader(new FileReader("RemoveDir.java"));



  10.                 PrintWriter out = new PrintWriter(s.getOutputStream(),true);


  11.                 String line = null;
  12.                 while((line=bufr.readLine())!=null)
  13.                 {
  14.                         out.println(line);
  15.                 }

  16.                 //s.shutdownOutput();//关闭客户端的输出流。相当于给流中加入一个结束标记-1.
  17.                 //

  18.                
  19.                 BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

  20.                 String str = bufIn.readLine();
  21.                 System.out.println(str);

  22.                 bufr.close();

  23.                 s.close();
  24.         }
  25. }
  26. class  TextServer
  27. {
  28.         public static void main(String[] args) throws Exception
  29.         {
  30.                 ServerSocket ss = new ServerSocket(10006);

  31.                 Socket s = ss.accept();
  32.                 String ip = s.getInetAddress().getHostAddress();
  33.                 System.out.println(ip+"....connected");


  34.                 BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));

  35.                 PrintWriter out  = new PrintWriter(new FileWriter("server.txt"),true);

  36.                 String line = null;

  37.                 while((line=bufIn.readLine())!=null)
  38.                 {
  39.                         //if("over".equals(line))
  40.                                 //break;
  41.                         out.println(line);
  42.                 }

  43.                 PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
  44.                 pw.println("上传成功");


  45.                 out.close();
  46.                 s.close();
  47.                 ss.close();

  48.         }
  49. }
复制代码

作者: 刘少伟    时间: 2012-4-15 03:52
24行的s.shutdownOutput()注释没去掉,客户端读完文件,接下来在等待服务端返回的信息,但由于没有关闭输出流(加结束标记),服务端循环没有结束,还在一直等待读入,readLine()是额阻塞式方法,所以两边都阻塞了。但其实文件还是上传成功了。
作者: 王德南    时间: 2012-4-15 08:05
从硬盘上读文件的话while((line=bufIn.readLine())!=null) 这个会自动结束的, 但是在往外写的时候,out.println(line),写完了却没有结束标记,那样对方在读取的时候循环就不会结束,所以要在写完后加个结束标记,也就是s.shutdownOutput()。但是你这个结束标记注释没去掉,所以会一直循环下去啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2