Ksh*_*rma 2 java sockets network-programming inputstream
我试图使用以下代码从网络套接字读取一些数据 -
Socket s = new Socket(address, 502);
response = new byte[1024];
InputStream is = s.getInputStream();
int count = is.read(response, 0, 100);
Run Code Online (Sandbox Code Playgroud)
数据量不大.它总共是16个字节.但是read()语句不能一次读取所有数据.它只能将8个字节的数据读入我的缓冲区.
我必须多次调用read()才能读取数据 -
Socket s = new Socket(address, 502);
response = new byte[1024];
InputStream is = s.getInputStream();
int count = is.read(response, 0, 100);
count += is.read(response, count, 100-count);
Run Code Online (Sandbox Code Playgroud)
为什么会这样?为什么read()不能一次读取整个流?
请注意,数据不会逐渐到达.如果我在通过调用Thread.sleep(2000)读取数据之前等待2秒,则行为保持不变.
为什么read()不能一次读取整个流?
因为没有指定这样做.见Javadoc.它会阻塞,直到至少有一个字节可用,然后返回介于1和所提供长度(包括1和1)之间的某个数字.
这反过来是因为数据不一定一次到达.您无法控制TCP如何发送和接收数据.您有义务将其视为字节流.
| 归档时间: |
|
| 查看次数: |
1654 次 |
| 最近记录: |