java中BufferedInputStream的 read(byte[] b,int off,int len)方法问题
答案:3 悬赏:10
解决时间 2021-01-10 12:18
- 提问者网友:遁入空寂
- 2021-01-09 15:58
java中BufferedInputStream的 read(byte[] b,int off,int len)方法问题
最佳答案
- 二级知识专家网友:思契十里
- 2021-01-09 17:05
请问你有没有让服务端返回一些数据到客户端,如果没有的话,由于在客户端的s.getInputStream()这个方法是阻塞式方法,所以只有在客户端读取到服务端返回的数据的时候才会继续向下执行。你说的跳不出while循环,我估计其实根本就没有执行到while循环那里去,而是在s.getInputStream()那里阻塞住了。
不知道我的解释是不是对的,因为楼主你没有把代码贴全,我也不好妄下定论。如果还有问题的话,希望楼主能把代码贴全了,最好是跟上打印的结果一起贴上来。
追问:
追答:是这样的,在客户端代码中的oswrite("你好,我是客户端".getBytes());其实是没有发送结束标记的,在发送的过程中将结束标记-1(byte类型的-1)给略去了,那么服务端那里收到的数据其实是没有结束标记的,也就是说br.read(buf)的返回值永远不可能为-1,所以在while循环中跳不出来。
至于如何添加结束标记,其实有三种方法:
添加自定义的结束标记,比如说"end"作为结束标记,但它有弊端就是如果传输的数据本身就含有"end"的话,这样就会导致数据传输不完全。
添加时间戳作为结束标记,就是将System.currentMillis() + “”;作为结束标记符,这样可行,但是比较麻烦,楼主可以自行查阅详细资料
利用Java提供的API来标记结束,就是调用Socket#shutdownOutput();这样就可以关闭Socket的输出流(其实内部原理就是添加了结束标记)。
那么在你的代码中可以这样
在客户端代码中
os.write("你好,我是客户端".getBytes());
// 在这行的后面加上
s.shutdownOutput();
即可。
不知道我的解释是不是对的,因为楼主你没有把代码贴全,我也不好妄下定论。如果还有问题的话,希望楼主能把代码贴全了,最好是跟上打印的结果一起贴上来。
追问:
追答:是这样的,在客户端代码中的oswrite("你好,我是客户端".getBytes());其实是没有发送结束标记的,在发送的过程中将结束标记-1(byte类型的-1)给略去了,那么服务端那里收到的数据其实是没有结束标记的,也就是说br.read(buf)的返回值永远不可能为-1,所以在while循环中跳不出来。
至于如何添加结束标记,其实有三种方法:
添加自定义的结束标记,比如说"end"作为结束标记,但它有弊端就是如果传输的数据本身就含有"end"的话,这样就会导致数据传输不完全。
添加时间戳作为结束标记,就是将System.currentMillis() + “”;作为结束标记符,这样可行,但是比较麻烦,楼主可以自行查阅详细资料
利用Java提供的API来标记结束,就是调用Socket#shutdownOutput();这样就可以关闭Socket的输出流(其实内部原理就是添加了结束标记)。
那么在你的代码中可以这样
在客户端代码中
os.write("你好,我是客户端".getBytes());
// 在这行的后面加上
s.shutdownOutput();
即可。
全部回答
- 1楼网友:天凉才是好个秋
- 2021-01-09 20:00
有没有Socket向这个ServerSocket写入流啊?
追问:
有的,
追问:
有的,
- 2楼网友:独行浪子会拥风
- 2021-01-09 18:35
br.read(buf) 只有在连接断开后才会返回 -1. 没有断开是返回不了-1的。你可以让客户端发送发后关闭端口。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯