关于Socket通讯当中,如何用byte[] 接收InputStream ?

tinwoo 2004-12-30 11:27:04
如果用in.read(byte[], int, int)读取,那么如何确定InputStream的大小而开辟相应大小的byte[]?
另外,我发现in.read()方法上说读取输入流完毕以后,最后后将返回-1,实际上并没有返回,除非连接关闭,这是为何?请各位前辈指点指点,谢谢!
...全文
519 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChDw 2004-12-30
  • 打赏
  • 举报
回复
只要连接没有关闭,Socket的根本无法知道服务器是不是已经没有数据过来了,所以它只好一直等待服务器的发送数据

如果服务器主动Close了Socket,read就会知道并返回-1通过你已经结束了

或者你在客户端设置了setSoTimeout,这样在没有数据的情况等待时间超过了,系统会抛出异常的
GJA106 2004-12-30
  • 打赏
  • 举报
回复
socket的inputstream是同步的,如果没有接收到数据,那程序就一直作read操作,直到有数据到达。当然你也可以设置setSoTimeout来定时跳过read这一步。
xitianjile 2004-12-30
  • 打赏
  • 举报
回复
意图不明确。
笑天狂客 2004-12-30
  • 打赏
  • 举报
回复
我也不清楚,帮你顶一下了
tinwoo 2004-12-30
  • 打赏
  • 举报
回复
int c = 0;
while ((c = is.read()) != -1) {
//do something...
//循环似乎挂在这里了
}
if (c == -1) {
System.out.println("client's c = -1 now..."); //没有被打印出来
}
xitianjile 2004-12-30
  • 打赏
  • 举报
回复
那么如何确定InputStream的大小而开辟相应大小的byte[]?

这个byte[]的大小可以根据文件的大小来确定。

也可以根据每次读进的东西的大小来确定。

比如可以这样

byte[] b=new byte[500];
int s=in.read(b,0,500);
int i=0;
while(s!=-1){
System.out.println(i+++":"+s);
s=in.read(b,0,500);
}
System.out.println("这时候的返回结果:"+s);
xitianjile 2004-12-30
  • 打赏
  • 举报
回复
没返回??
你是怎么用的??
我怎么试了N次都能返回-1呢。
wwalpha 2004-12-30
  • 打赏
  • 举报
回复
想起来了...

ByteBuffer有个flip方法

Flips this buffer. The limit is set to the current position and then the position is set to zero. If the mark is defined then it is discarded.

方便取适当长的数组...

wwalpha 2004-12-30
  • 打赏
  • 举报
回复
in.read()方法

在inputstream没有数据的时候会一直阻塞下去,直到能读出数据或者connection reset

setSoTimeout会抛出SocketException,Sun 并不推荐用Exception来控制程序流程,这样会增加消耗

JDK 1.4 开始有SocketChannel类 的无阻塞模式,可以在read的时候不用一直阻塞下去.让其他线程运行

JDK 1.4 以下可以用程序模拟实现无阻塞状态

忘了当时写的时候为什么用ByteBuffer类来存储byte...byte[] 好像碰到了点什么问题-_-;


tinwoo 2004-12-30
  • 打赏
  • 举报
回复
自己顶一下,各位前辈指点指点。
tinwoo 2004-12-30
  • 打赏
  • 举报
回复
to xitianjile:
byte[]的大小可以根据文件的大小来确定,如何实现呢?
比如要传输某个文件,在接收这方需要开辟一个相同大小的byte[]来接收,文件的大小又如何取得,又如何判断文件已经传输结束呢?难道只能在发送方写入某个结束符吗,比如"/r/n"用来表示结束吗?

67,538

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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