本帖最后由 x378320002 于 2013-7-4 10:28 编辑
IO流中有read()方法,哪个高手能解释下它是怎么判断这个方法结束的?
文档里只是说在输入数据可用、检测到文件末尾或者抛出异常前,就一直阻塞。
查看源代码是本地代码,看不了,估计看到了也看不懂,不太精通c、c++。
就是输入流怎么知道数据可不可用,是不是流末尾的?
就像毕老师讲课中的模拟浏览器给tomcat发信息的例子- Socket s = new Socket("192.168.1.100",8080);
-
- //模拟浏览器,给tomcat服务端发送符合http协议的请求消息。
- PrintWriter out = new PrintWriter(s.getOutputStream(),true);
- out.println("GET /myweb/1.html HTTP/1.1");
- out.println("Accept: */*");
- out.println("Host: 192.168.1.100:8080");
- out.println("Connection: close");
- out.println();
- out.println();
-
- InputStream in = s.getInputStream();
- byte[] buf = new byte[1024];
- int len = in.read(buf);
复制代码 并没有给tomcat发送什么结束信息,tomcat那边的读方法为什么不一直阻塞?
还有我自己写的一个上传图片的程序,先上传图片名字,再上传图片的,客户端- // 先发送名字过去---------
- OutputStream fout=s.getOutputStream();
- fout.write(f.getName().getBytes());
- // 在发送内容过去
- byte[] barr=new byte[1024];
- int len=0;
- while((len=fin.read(barr))!=-1){
- fout.write(barr, 0, len);
- }
复制代码 服务端部分代码- // 从socket读取文件名字
- InputStream in = s.getInputStream();
- byte[] barr = new byte[1024];
- int len = in.read(barr); //--------------这里为什么没有阻塞?
- String name = new String(barr, 0, len);
复制代码 我觉得这里的客户端那发送名字和发送内容几乎没有间隔,应该是不行的,我认为服务器端的int len = in.read(barr);在接收到
名字的数据后会继续阻塞,因为ta但是实际并没有,在接受到名字字符串后就直接建立了文件。
|