社区
Java EE
帖子详情
关于Socket通讯当中,如何用byte[] 接收InputStream ?
tinwoo
2004-12-30 11:27:04
如果用in.read(byte[], int, int)读取,那么如何确定InputStream的大小而开辟相应大小的byte[]?
另外,我发现in.read()方法上说读取输入流完毕以后,最后后将返回-1,实际上并没有返回,除非连接关闭,这是为何?请各位前辈指点指点,谢谢!
...全文
519
11
打赏
收藏
关于Socket通讯当中,如何用byte[] 接收InputStream ?
如果用in.read(byte[], int, int)读取,那么如何确定InputStream的大小而开辟相应大小的byte[]? 另外,我发现in.read()方法上说读取输入流完毕以后,最后后将返回-1,实际上并没有返回,除非连接关闭,这是为何?请各位前辈指点指点,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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"用来表示结束吗?
Socket
服务端客户端以tcp/ip协议发送
接收
报文
本教程将详细讲解如何利用Java
Socket
实现基于TCP/IP的服务端和客户端之间的报文发送与
接收
。 TCP(传输控制协议)是一种面向连接、可靠的传输协议,它确保了数据包的有序和无损传输。IP(互联网协议)则是互联网上...
android
socket
通信实例程序
InputStream
inputStream
=
socket
.get
InputStream
();
byte
[] buffer = new
byte
[1024]; int length =
inputStream
.read(buffer); String receivedData = new String(buffer, 0, length); // 处理
接收
到的数据...
android
socket
通信客户端服务器源代码
在客户端(
Socket
Test)的实现中,首先要创建一个
Socket
对象,指定服务器的IP地址和端口号,然后通过
Socket
的输出流(OutputStream)发送数据,通过输入流(
InputStream
)
接收
数据。以下是一个简单的示例: ```java...
android
socket
编程实例
在实际开发中,我们通常会封装一个
Socket
通信类,提供发送和
接收
数据的方法,以便在应用的其他部分轻松使用。此外,考虑到网络连接可能不稳定,可以使用心跳机制来检测连接状态,及时重连。 对于安全性,如果你的...
Android端与服务端TCP
通讯
综上所述,Android与服务端通过TCP进行
通讯
是通过
Socket
对象实现的,包括创建
Socket
、打开输入/输出流、发送和
接收
数据以及关闭连接等步骤。这个过程涉及到TCP/IP协议的基本原理和Android的网络权限管理。通过封装和...
Java EE
67,538
社区成员
225,852
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章