A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾振凯 中级黑马   /  2013-4-7 11:31  /  1199 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 贾振凯 于 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()的时候才会把打印内容输出给浏览器??????????????

4 个回复

倒序浏览
你这个问题我以前遇到过
这个不是PrintStream的问题而是,这是从流里读取数据,因为从流里读取数据,没有结束标记,
所以服务端一直等待
记住:从流里读取数据,因为没有回车键的判断,所以他会一直等,一直等
你close()以后,它就停止了,所以就停止读取,有字样了
这样的时候,要使用字节流
byte[] bytes = new byte[1024];
fr.write(bytes,0,bytes.length);
这样就可以了,不要让其运行阻塞的方法

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
我手心里的宝 发表于 2013-4-7 13:07
你这个问题我以前遇到过
这个不是PrintStream的问题而是,这是从流里读取数据,因为从流里读取数据,没有结 ...

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

这个PrintStream自动刷新了 不是这里的问题,而是服务端的问题,这个一点问题都没有
服务端在等待读取内容,虽然自动刷新了,但是没有结束标记,所以还在等
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马