黑马程序员技术交流社区

标题: java为什么flush( )方法不能输出数据,一定要close( )才行? [打印本页]

作者: 红茶2331    时间: 2013-11-19 20:10
标题: java为什么flush( )方法不能输出数据,一定要close( )才行?
  1. 服务端:
  2. ServerSocket ss=new ServerSocket(40006);
  3. while(true)
  4. {
  5. Socket s=ss.accept();
  6. OutputStream os=s.getOutputStream();
  7. os.write("北京".getBytes());
  8. os.flush();//这里改成os.close( ),客户端就能读到,这是为什么啊?
  9. }

  10. 客户端:
  11. try {
  12. Socket s=new Socket("192.168.0.110",40006);
  13. InputStream ins=s.getInputStream();
  14. BufferedReader br=new BufferedReader(new InputStreamReader(ins));
  15. String line;
  16. while((line=br.readLine())!=null)
  17. {
  18. System.out.println(line);
  19. }
复制代码

作者: ysunday    时间: 2013-11-19 21:15
是第3行的while捣的鬼,服务端先开启,然后执行到05行等待,然后等到客户端执行,客户端执行后,服务端这边才ss.accept()。然后while循环开始转,但是while是个死循环,始终往流里边写数据,然后你客户端的那个17行,就一直读啊读,因为你服务端一直往流里边写数据啊 ,所以客户端这边的读始终读不到null,既然读不到null,那就一直读呗,结果两边都死住了,除非服务端停止写,或者服务端关闭流(关闭流肯定就不写数据了)。
所以要么你让服务端while,停调,要么你关闭流

再说 你这代码写的不是很好啊  
Socket s=ss.accept();
OutputStream os=s.getOutputStream();
这两句下载while外边

服务
  1.         // TODO Auto-generated method stub
  2.                 ServerSocket ss=new ServerSocket(40007);
  3.                 Socket s=ss.accept();
  4.                 OutputStream os=s.getOutputStream();
  5.                 int i = 0;
  6.                 while(i < 2)
  7.                 {
  8.                         i++;
  9.                 os.write("北京".getBytes());
  10.                 os.flush();//,客户端就能读到,这是为什么啊?
  11.                 }
复制代码
客户写的还行,能看
作者: 吴琼cola    时间: 2013-11-21 09:05
1.写关于流类的操作,记得要关闭流,不然流一直存在,占用资源。
try{
while(true)
{
Socket s=ss.accept();
OutputStream os=s.getOutputStream();
os.write("北京".getBytes());
os.flush();//这里改成os.close( ),客户端就能读到,这是为什么啊?
}
}catch(Exception e){
    e.printStack();
}finally{
     关闭流类的操作。
}




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