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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢威 中级黑马   /  2013-7-24 16:50  /  1458 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-25 22:56 编辑

下面代码中readLine()已经写到最后一行后,再继续readLine()读的值应该是null,为什么line的值不是null呢,而且还要定义结束标记?

  1. import java.io.*;
  2. import java.net.*;

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

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

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

  10.                 String line = null;
  11.                 while((line=bufr.readLine())!=null)
  12.                 {
  13.                         out.println(line);
  14.                 }
  15.                 //这里line已经写到最后一行了,最后一行不已经是null了吗,也就是line=null,为什么还要定义一个结束标记呢?
  16.                 out.println("over");

  17.                 BufferedReader bufin = new BufferedReader(new InputStreamReader(s.getInputStream()));

  18.                 String str = bufin.readLine();
  19.                 System.out.println(str);

  20.                 //bufin.close();为什么这里不关闭bufin缓冲区呢?
  21.                 bufr.close();
  22.                 s.close();
  23.         }
  24. }


  25. class  TextServer2
  26. {
  27.         public static void main(String[] args) throws Exception
  28.         {
  29.                 ServerSocket ss = new ServerSocket(10086);

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

  33.                 BufferedReader bufin = new BufferedReader(new InputStreamReader(s.getInputStream()));

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

  35.                 String line = null;
  36.                 while ((line=bufin.readLine())!=null)
  37.                 {
  38.                         if("over".equals(line))
  39.                                 break;
  40.                         out.println(line);
  41.                 }

  42.                 PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
  43.                 pw.println("上传完成");
  44.                
  45.                 //bufin.close();这里为什么不关闭bufin缓冲区呢?
  46.                 out.close();
  47.                 s.close();
  48.                 ss.close();
  49.         }
  50. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

7 个回复

倒序浏览
PrintWriter out =new PrintWriter(s.getOutputStream(),ture);out.println("over") 这里的out是告诉服务端我输入over结束了;

readline()是读取缓冲区文件流==null就是读完数据了;这两者的意思完全是不一样的!

s.accpet(); 接收服务端都关了,缓冲区自然就关了;

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
PrintWriter out =new PrintWriter(s.getOutputStream(),ture);out.println("over") 这里的out是告诉服务端我输入over结束了;

readline()是读取缓冲区文件流==null就是读完数据了;这两者的意思完全是不一样的!

s.accpet(); 接收服务端都关了,缓冲区自然就关了;
回复 使用道具 举报
PrintWriter out =new PrintWriter(s.getOutputStream(),ture);out.println("over") 这里的out是告诉服务端我输入over结束了;

readline()是读取缓冲区文件流==null就是读完数据了;这两者的意思完全是不一样的!

s.accpet(); 接收服务端都关了,缓冲区自然就关了;
回复 使用道具 举报
(1)客户端是已经读完了,并且发送完了,而且在String str = bufin.readLine();时阻塞暂停,等服务端发信息。此时服务端line=bufin.readLine()并不知道对方已经发送完了,也就阻塞暂停了。所以双方都在暂停。
(2)bufin关联的是s,所以s关闭了,流也就没有数据了。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
// out.println("over"); 要是程序可以执行到这句代码,说明while循环不满足条件也就是line=null了。也就是说读取的.java 文件已经读完了。定义这行代码来做结束标记是没意义的。

//s.close();  因为bufin中的字节流根据s.getInputStream()来获取。s资源关闭后,bufin相应的也关闭了。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
line=null只是退出了客户端的while循环,而out.println("over")是向服务端写入一个over结束符,服务端靠识别该结束符退出while循环,两个结束标记不同
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马