Socket请求中readLine()方法引发的思考
背景:
今天没事自己模拟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()才会读取到数据,接着下面的才会正常执行。
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Socket请求中readLine()方法引发的思考
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Socket请求中readLine()方法引发的思考