黑马程序员技术交流社区

标题: Socket流中readLine()方法阻塞的小疑问 [打印本页]

作者: 李敬    时间: 2012-8-20 05:51
标题: Socket流中readLine()方法阻塞的小疑问
本帖最后由 李敬 于 2012-8-20 05:55 编辑

网络编程知识点中的代码
import java.io.*;
import java.net.*;

class  TextClient
{
        public static void main(String[] args) throws Exception
        {
                Socket s = new Socket("192.168.1.254",10006);
                BufferedReader bufr =
                        new BufferedReader(new FileReader("IPDemo.java"));
                PrintWriter out = new PrintWriter(s.getOutputStream(),true);
                String line = null;
                while((line=bufr.readLine())!=null)//A---在这里如果没有了数据会阻塞
                {
                        out.println(line);
                }
                s.shutdownOutput();//B---所以要关闭客户端的输出流。相当于给流中加入一个结束标记-1.
                BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
                String str = bufIn.readLine();
                System.out.println(str);
                bufr.close();
                s.close();
        }
}
class  TextServer
{
        public static void main(String[] args) throws Exception
        {
                ServerSocket ss = new ServerSocket(10006);
                Socket s = ss.accept();
                String ip = s.getInetAddress().getHostAddress();
                System.out.println(ip+"....connected");
                BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
                PrintWriter out  = new PrintWriter(new FileWriter("server.txt"),true);
                String line = null;
                while((line=bufIn.readLine())!=null)//C---这里也会阻塞
                {
                        out.println(line);
                }
                PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
                pw.println("上传成功");
                out.close();
                s.close();
                ss.close();

        }
}

我的问题就是
socket这种方式中的readLine没有数据时会阻塞
我们之前写的本地的文本复制程序中,readLine没有数据不会阻塞.
这有什么区别吗?




作者: 刘圣伟    时间: 2012-8-20 06:47
本帖最后由 刘圣伟 于 2012-8-20 06:55 编辑

socket这种方式中的readLine没有数据时会阻塞
我们之前写的本地的文本复制程序中,readLine没有数据不会阻塞.
这有什么区别吗?

readline()方法阻塞的意思是,一直等带数据的输入。没有数据输入就一直等待。直到有数据输入的时候,就读了。

而文本复制中,readline也是一样的。
判断的条件是不为空的时候,文件中有内容,就一直读,,没有就是null,
所有循环结束。
其实主要是网络中,它阻塞是因为没有数据源传过来
而,文件中,已经有源了,只要读就好了






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