如何判断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??????
...全文
660 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,620

社区成员

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

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