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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史政法 中级黑马   /  2013-5-25 11:27  /  1252 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.io.*;
  2. import java.net.*;
  3. class  Demo
  4. {
  5.         public static void sop(Object obj){
  6.                 System.out.println(obj);
  7.         }

  8.         public static void main(String[] args) throws Exception {
  9.                 ServerSocket ss = new ServerSocket(10000);

  10.                 while(true){
  11.                         Socket s = ss.accept();

  12.                         String ip = s.getInetAddress().getHostAddress();

  13.                         System.out.println(ip);

  14.                         InputStream in = s.getInputStream();

  15.                         byte[] buf = new byte[1024];

  16.                         int len = in.read(buf);//把下面从   OutputStream开始到out.flush()结束  注释掉,这里就读不到数据。为什么?
  17.                                                                         //不是应该获取到了浏览器的读取流对象,可以读取浏览器发来的数据了吗?为什么不行?

  18.                         System.out.println(new String(buf,0,len));

  19.                         OutputStream out = s.getOutputStream();

  20.                         out.write("服务端反馈的信息".getBytes());

  21.                         out.flush();

  22.                         s.close();//如果把这里注释掉,浏览器就接收不到数据,,为什么不关流,浏览器就收不到数据呢?每次写的数据也都刷出去了啊?
  23.                 }

  24.                
  25.                 //ss.close();
  26.         }
  27. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

1 个回复

倒序浏览
首先,并不是读不到数据,是你已经读到了数据,打个比方说吧:就号比你拿杯子喝水,inputStream就相当于往杯子面倒水,outPutStream到flush()之间的代码就相当于拿起杯子一饮而尽,现在是不是你inputStream有读数据,但是不幸的是,你只是把杯子当摆设了,没喝水,还说说说,为啥我还是口渴的呢。就是说你把数据读进一个缓冲区,你要对这个缓冲区也好,什么也罢,你得去操作之,不然,你读的数据跟白读一样,是一堆没有的0和1.
其次:JDK这么说:colse(),所有当前阻塞于此套接字上的 I/O 操作中的线程都将抛出 SocketException。 套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字。 关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。 如果此套接字有一个与之关联的通道,则关闭该通道。

简而言之,就是说socket是一个阻塞的方法,那我们知道,一个程序中不光只有建立socket这样一个线程,还有其他的线程,如果对流资源读写结束,而没有关闭socket,程序就会挂在这里,后面的程序就别想执行了。colse(),有两个作用,关闭当前资源,另一个,相当于flush().

这是我的理解,希望对楼主有用。


评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马