如何判断java流的末尾????

zhang9494xz 2008-11-19 05:11:58
服务端向客户端发送数据流,服务端发完了数据不关闭流。
我在客户端读流,我无法读到-1,所以无法判断流的末尾。
有没有人指点我下,如何才能判断出流的末尾?(服务端我无法控制,我只能控制客户端)

还有:
byte[] buffer = new byte[1024];
while( (word = receiver.read(buffer)) != -1){
System.out.println(word);
}
结果:
1024
1024
1024
1024
691
1024
1024
1024
1024
1024
720
1024
1024
383
在没有读到末尾的时候,为什么word有的时候不是1024??????
...全文
505 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang9494xz 2008-11-21
  • 打赏
  • 举报
回复
恩,我就是用16进制计算的,第一部分指定Chunk的长度一般会比实际长度多几位,若长了会多20-30位甚至更多。(并且我把CR和LF也都算上了,还是少)
lisl2003 2008-11-20
  • 打赏
  • 举报
回复
学习一下
云上飞翔 2008-11-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhang9494xz 的回复:]
谢谢指点...明白了...
不过,好像第一部分指定Chunk的长度,好像不是很准确
[/Quote]
答:Chunk的长度,是用十六进制的数值串表示的.
Sou2012 2008-11-19
  • 打赏
  • 举报
回复
chunked编码,有chuck头,chunk,等部分组成
wrong1111 2008-11-19
  • 打赏
  • 举报
回复
mark
lianpengyan_0719 2008-11-19
  • 打赏
  • 举报
回复
study
zhang9494xz 2008-11-19
  • 打赏
  • 举报
回复
谢谢指点...明白了...
不过,好像第一部分指定Chunk的长度,好像不是很准确
云上飞翔 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhang9494xz 的回复:]
那么二楼的意思就是,如果没有定好协议来判断结束标志,那么不管任何程序(java,c++)都无法判断结束喽?


服务器给我发送过:
HTTP/1.1 200 OK
Server: Resin/3.0.21
Cache-Control: no-cache
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 19 Nov 2008 06:41:11 GMT

list=["a","b"];
0

没有Content-…
[/Quote]

答:你早点说,是采用的HTTP协议,不就行了.HTTP协议当然考虑到了数据结束的问题.由于服务器传来的编码是:
Transfer-Encoding: chunked
则按HTTP协议中对chunked 方式可进行长度计算.(那个一个或以上的"0",确实表示这是最后一个chunked)
数据长度计算规则是(伪代码):
length := 0
read chunk-size, chunk-extension (if any) and CRLF
while (chunk-size > 0) {
read chunk-data and CRLF
append chunk-data to entity-body
length := length + chunk-size
read chunk-size and CRLF
}
read entity-header
while (entity-header not empty) {
append entity-header to existing header fields
read entity-header
}
Content-Length := length

sll853 2008-11-19
  • 打赏
  • 举报
回复
学习
catyang22 2008-11-19
  • 打赏
  • 举报
回复
网络的还真不大明白
opengl231 2008-11-19
  • 打赏
  • 举报
回复
友情up
android2008 2008-11-19
  • 打赏
  • 举报
回复
友情up
NickCheng 2008-11-19
  • 打赏
  • 举报
回复
阅!!!
shenjie1989 2008-11-19
  • 打赏
  • 举报
回复
指明传送长度
协议中约定一个特殊的标记值,触发该标记
zhang9494xz 2008-11-19
  • 打赏
  • 举报
回复
那么二楼的意思就是,如果没有定好协议来判断结束标志,那么不管任何程序(java,c++)都无法判断结束喽?


服务器给我发送过:
HTTP/1.1 200 OK
Server: Resin/3.0.21
Cache-Control: no-cache
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 19 Nov 2008 06:41:11 GMT

list=["a","b"];
0

没有Content-Length:
也没有</html>结束
是不是那个0就是他们协议默认的结束标志?????,否则他们自己也无法判断结束了。
云上飞翔 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhang9494xz 的帖子:]
服务端向客户端发送数据流,服务端发完了数据不关闭流。
我在客户端读流,我无法读到-1,所以无法判断流的末尾。
有没有人指点我下,如何才能判断出流的末尾?(服务端我无法控制,我只能控制客户端)

还有:
byte[] buffer = new byte[1024];
while( (word = receiver.read(buffer)) != -1){
System.out.println(word);
}
结果:
1024
1024
1024
1024
691
1024
1024
1024
1024
102…
[/Quote]

答:当然读不到-1啦. 只有当对象关闭流时,你才能读到-1啊.
网络通信程序的关键是:双方的应用层的通信协议.你们在制定通信协议时,就要考虑好.在不关闭连接的情况下,最常见的
方法是传送长度信息(如:HTTP协议中的Content-Length:长度),或者在协议中约定一个特殊的标记值.一句话:必须在制定协议时就要考虑好.不要先写程序,后定协议.
macleane 2008-11-19
  • 打赏
  • 举报
回复
貌似网络流没有末尾

解决办法:
1、先发送一个指定长度的头,头中指明正文长度,然后以该长度读取正文
2、以规定的字符或格式结束

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧