Socket请求中readLine()方法引发的思考

  • 时间:2018-12-01 23:37 作者:碎碎想 来源:碎碎想 阅读:548
  • 扫一扫,手机访问
摘要:背景:今天没事自己模拟socket请求时发现了一个问题://测试代码public static void http(String path) throws Exception { URL url = new URL(path); final String host = url.getHo

背景:
今天没事自己模拟socket请求时发现了一个问题:

//测试代码public static void http(String path) throws Exception {    URL url = new URL(path);    final String host = url.getHost();    //假如指明了端口,则拿到端口,否则是-1    int port = url.getPort();    int defaultPort = url.getDefaultPort();    final String file = url.getFile();    Socket socket = new Socket(host, port == -1 ? defaultPort : port);    InputStream is = socket.getInputStream();    final BufferedReader br = new BufferedReader(new InputStreamReader(is));    final OutputStream os = socket.getOutputStream();//开启一个线程用来读取数据   new Thread(){        @Override        public void run() {            String line;            try {                while ((line = br.readLine()) != null){                    Log.e("TAG",line);                }            } catch (IOException e) {                e.printStackTrace();            }        }    }.start();//开启一个线程用来发送数据   new Thread(){       @Override       public void run() {           SystemClock.sleep(10000);           try {               //请求行               os.write(("GET "+file+" HTTP/1.1\r\n").getBytes());               os.write(("Host: "+host+"\r\n").getBytes());               os.write(("\r\n").getBytes());               os.flush();           }catch (Exception e){               }       }   }.start();/*   //请求行    os.write(("GET "+file+" HTTP/1.1\r\n").getBytes());    os.write(("Host: "+host+"\r\n").getBytes());    os.write(("\r\n").getBytes());    os.flush();*/}

通过代码都能看到:
我用了两种测试方式:
第一次:开启一个线程用来读取数据,发送数据没有在子线程中发送,但是是在读取数据方法的下面。按照常理来说这样的代码会先执行读取数据的方法。结果通过断点调试发现是先执行的发送数据的方法,而后执行的读取数据的方法。 这里可能就会有人说了开启线程需要一些的时间。好,那么我就有了第二次测试。
第二次(如上面代码):我把发送数据的代码也在z线程中执行,并且在该线程中睡10秒之后在执行发送数据的代码,结果还是和上面一样:先执行的发送数据的代码,而后再执行的读数据的方法。

针对上面问题其实有一个误会,就是对readLine()方法的误会。 误以为readLine()是读取到没有数据时就返回null。而实际上readLine()是一个阻塞函数。当没有数据读取时,就会造成IO阻塞,这个方法就会一直阻塞在这里。所以只有等发送数据的方法执行完之后,readLine()才会读取到数据,接着下面的才会正常执行。

  • 全部评论(0)
最新发布的资讯信息
【系统环境|】2FA验证器 验证码如何登录(2024-04-01 20:18)
【系统环境|】怎么做才能建设好外贸网站?(2023-12-20 10:05)
【系统环境|软件环境】梦幻仙域游戏攻略(2023-12-19 10:02)
【系统环境|软件环境】梦幻仙域游戏攻略(2023-12-19 10:02)
【系统环境|】卡帕部落揭秘潮玩新宠,探究玩法(2023-12-14 09:45)
【系统环境|数据库】 潮玩宇宙游戏道具收集方法(2023-12-12 16:13)
【系统环境|】如何开发搭建卡帕部落模式源码(2023-12-12 10:44)
【系统环境|】遥遥领先!青否数字人直播系统5.0发布,支持真人接管实时驱动!(2023-10-12 17:31)
【系统环境|服务器应用】克隆自己的数字人形象需要几步?(2023-09-20 17:13)
【系统环境|】Tiktok登录教程(2023-02-13 14:17)
手机二维码手机访问领取大礼包
返回顶部