我正在尝试从服务器向客户端发送数据字节,因此我使用文件指针指向文件已读取的位置并读取字节集并将其发送给客户端。
以下是服务器端
byte[] b = readByte()// my function which return bytes of Data
ServletOutputStream stream = httpServletResponse.getOutputStream();
stream.flush();
stream.write(b);
stream.flush();
以下是客户端
URL url = new URL("http://localhost:1222/?filePointer=" + fp);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
InputStream is = conn.getInputStream();
System.out.println("Connection Open");
int pos = 0;
byte[] b = new byte[buffLength];
while (pos != -1) {
pos = is.read(b, pos, b.length - pos);
}
write2File(b);
上面的代码适用于bufferLength为20Kb,因为bufferLength增加了,我收到了不正确的值。
答案 0 :(得分:1)
因为你已经澄清了服务器和客户端对要传输的字节数有共同的共识,由bufferLength
表示,你是对的,他们不需要交换那个长度。
但是客户端确实需要使用这个长度。您的问题出在客户端的读取循环中:
int pos = 0; byte[] b = new byte[buffLength]; while (pos != -1) { pos = is.read(b, pos, b.length - pos); }
有一个确定的和一个潜在的主要问题:
您的接收代码在循环的第三次和后续迭代中没有正确填充目标数组(当执行多次迭代时),因为pos
仅记录最多接收的字节数最近的read()
。您需要使用在所有之前读取的字节中读取的总字节数到该点,以确定要尝试读取的偏移量和字节数。
InputStream.read()
将仅在流的末尾返回-1
,这通常不会在网络流上发生,直到远端关闭。如果服务器在写入数组后没有从其末端关闭连接(至少是输出端),则客户端将挂起尝试读取它。特别是,如果pos
等于b.length
,它将进入紧密循环,因此请求的字节数为0.