黑马程序员技术交流社区

标题: 网络编程之PrintStream疑惑 [打印本页]

作者: 贾振凯    时间: 2013-4-7 11:31
标题: 网络编程之PrintStream疑惑
本帖最后由 贾振凯 于 2013-4-7 11:38 编辑
  1. public class InetAddressDemo {

  2. public static void main(String[] args) throws IOException, InterruptedException{
  3. System.out.println(InetAddress.getLocalHost().toString());
  4. ServerSocket ss = new ServerSocket(11100);
  5. Socket s = ss.accept();
  6. PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
  7. pw.println("<font size='18' color='red'>你好</font>");
  8. BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
  9. String line = null;
  10. while((line = br.readLine()) != null){
  11. if(line.contains("Connection")){
  12. break;
  13. }
  14. System.out.println(line);
  15. }
  16. /*InputStream is = s.getInputStream();
  17. byte[] buf = new byte[1024];
  18. int len = is.read(buf);
  19. System.out.println(new String(buf,0,len));*/
  20. s.close();
  21. ss.close();
  22. }
  23. }
复制代码
当用浏览器对这个自定义服务端发出请求时,如果没有这句话
if(line.contains("Connection")){
break;
}
那么程序就会阻塞,浏览器也能不收到"你好"字样
但是PrintWriter pw = new PrintWriter(s.getOutputStream(),true);定义的是自动刷新啊
为什么每次都要等到s.close()的时候才会把打印内容输出给浏览器??????????????


作者: 我手心里的宝    时间: 2013-4-7 13:07
你这个问题我以前遇到过
这个不是PrintStream的问题而是,这是从流里读取数据,因为从流里读取数据,没有结束标记,
所以服务端一直等待
记住:从流里读取数据,因为没有回车键的判断,所以他会一直等,一直等
你close()以后,它就停止了,所以就停止读取,有字样了
这样的时候,要使用字节流
byte[] bytes = new byte[1024];
fr.write(bytes,0,bytes.length);
这样就可以了,不要让其运行阻塞的方法
作者: 贾振凯    时间: 2013-4-7 13:47
我手心里的宝 发表于 2013-4-7 13:07
你这个问题我以前遇到过
这个不是PrintStream的问题而是,这是从流里读取数据,因为从流里读取数据,没有结 ...

阻塞我明白,就是不明白PrintStream是自动刷新的,打印内容为什么不可以直接显示在浏览器上而是要等待close()
作者: 我手心里的宝    时间: 2013-4-7 13:50
这个PrintStream自动刷新了 不是这里的问题,而是服务端的问题,这个一点问题都没有
服务端在等待读取内容,虽然自动刷新了,但是没有结束标记,所以还在等
作者: 我手心里的宝    时间: 2013-4-7 13:50
贾振凯 发表于 2013-4-7 13:47
阻塞我明白,就是不明白PrintStream是自动刷新的,打印内容为什么不可以直接显示在浏览器上而是要等待close ...

这个PrintStream自动刷新了 不是这里的问题,而是服务端的问题,这个一点问题都没有
服务端在等待读取内容,虽然自动刷新了,但是没有结束标记,所以还在等




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