首先,你要仔细看明白read()方法的介绍: 从输入流读取下一个数据字节。返回 0 到 255 范围内的 int 字节值。如果因已到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流的末尾或者抛出异常前,此方法一直阻塞。 你的流根本就没有到达结尾,read()方法一直阻塞,怎么会返回-1呢? socket和文件不一样,你从文件中读,读到末尾就到达流的结尾了,所以会返回-1,循环结束 socket如果不关闭的话,你的input会一直等待它发送数据,一直在等,就是所谓的阻塞了。所以整个程序都阻塞了。 另外caofaping说的“read(byte[] b) 读取最大byte[]的大小的数据, 这里没有阻塞的原因是你只读取byte数组的数据,没有while(true)...”也说明白了为什么你用注释里面的代码不会阻塞的原因。 客户端的代码为什么不会阻塞?因为如果你在服务器端激活注释里面的代码之后,服务器发送一个消息之后就执行finally里面的代码关闭socket了,在客户端就是输入流已经到达结尾了,所以不会阻塞。如果你不用注释里面的代码,服务器端一直在阻塞的,客户端肯定也在阻塞等待。 说了这么多,不知道你明白没有
方法一:(有小bug:数据大小刚好等于这个奇数)
private static final int max= 32769;
public void read(InputStream in, int max, boolean isFileStream) throws IOException { int len = 0; byte[] temp = new byte[max]; int minLength = isFileStream ? 0 : max; while(true){ len = in.read(temp); if(len > 0){ this.append(temp, len); }