中易网

java中BufferedInputStream的 read(byte[] b,int off,int len)方法问题

答案:3  悬赏:10  
解决时间 2021-01-10 12:18
java中BufferedInputStream的 read(byte[] b,int off,int len)方法问题
最佳答案
请问你有没有让服务端返回一些数据到客户端,如果没有的话,由于在客户端的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();
即可。
全部回答
有没有Socket向这个ServerSocket写入流啊?
追问:
有的,
br.read(buf) 只有在连接断开后才会返回 -1. 没有断开是返回不了-1的。你可以让客户端发送发后关闭端口。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
最近玩dnf都会断网 啥情况啊
全国飞行器动力工程排名
鹤一期这个梗怎么来的!
JASMB这个品牌如何
请问玄天大师只帮起名吗
已知方程2x加3y等于二当x与y互为相反数,求x
1千万亿美元什么是概念???
66通怎么样?行业第三方平台是什么意思?
江南美术馆地址有知道的么?有点事想过去
单名一个“琳”字是什么意思?
我能上微信号但是忘了QQ密码怎么办
为什么袖子上有两条杠杠的那么多人穿 叫什
括号3x-4^2等于括号4x-3^2
诺斯塔罗牌和维特塔罗牌有什么区别,哪个更好
1999年1月生的到2017年1月是多大岁数
推荐资讯
撒漏黑油 那把油······· 歌词 求歌名
win10中磁盘经常占用100%服务本地系统里面高
西交大护理考研难还是兰大护理考研难?
求一段为51单片机编写的LCD电子时钟的设计,
客运专线的路基与普通铁路路基有什么不同?
如是者六七始已,是什么意思
家里种牡丹不吉利吗
谁有睡在我上铺的兄弟的百度云谢谢
为什么星球什么颜色都有
LOL你知道哪些英雄比较克制蛮王吗
一女四夫
有个相声,讲的唱戏的忘了台词和一个忘了自己
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?