黑马程序员技术交流社区
标题:
Socket问题
[打印本页]
作者:
史政法
时间:
2013-5-25 11:27
标题:
Socket问题
import java.io.*;
import java.net.*;
class Demo
{
public static void sop(Object obj){
System.out.println(obj);
}
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10000);
while(true){
Socket s = ss.accept();
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip);
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);//把下面从 OutputStream开始到out.flush()结束 注释掉,这里就读不到数据。为什么?
//不是应该获取到了浏览器的读取流对象,可以读取浏览器发来的数据了吗?为什么不行?
System.out.println(new String(buf,0,len));
OutputStream out = s.getOutputStream();
out.write("服务端反馈的信息".getBytes());
out.flush();
s.close();//如果把这里注释掉,浏览器就接收不到数据,,为什么不关流,浏览器就收不到数据呢?每次写的数据也都刷出去了啊?
}
//ss.close();
}
}
复制代码
作者:
李慧声
时间:
2013-5-27 19:24
首先,并不是读不到数据,是你已经读到了数据,打个比方说吧:就号比你拿杯子喝水,inputStream就相当于往杯子面倒水,outPutStream到flush()之间的代码就相当于拿起杯子一饮而尽,现在是不是你inputStream有读数据,但是不幸的是,你只是把杯子当摆设了,没喝水,还说说说,为啥我还是口渴的呢。就是说你把数据读进一个缓冲区,你要对这个缓冲区也好,什么也罢,你得去操作之,不然,你读的数据跟白读一样,是一堆没有的0和1.
其次:JDK这么说:colse(),
所有当前阻塞于此套接字上的 I/O 操作中的线程都将抛出 SocketException。
套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接或重新绑定)。需要创建新的套接字。
关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。
如果此套接字有一个与之关联的通道,则关闭该通道。
简而言之,就是说socket是一个阻塞的方法,那我们知道,一个程序中不光只有建立socket这样一个线程,还有其他的线程,如果对流资源读写结束,而没有关闭socket,程序就会挂在这里,后面的程序就别想执行了。colse(),有两个作用,关闭当前资源,另一个,相当于flush().
这是我的理解,希望对楼主有用。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2