套接字批量读取返回了一个零数组
Socket bulk reading returned an array of zeros
我一直在编写一个简单的文件传输程序,它打开到服务器的 TCP 连接,协商文件传输的条款(通过 TCP)并将文件从客户端流式传输到服务器。问题是大文件几乎总是损坏。我记录了套接字 InputStream
和 OutputStream
,发现虽然数据一开始是匹配的,但在几千字节之后发生了有趣的不同步。
在某个时刻,接收套接字开始读取 0
,而发送套接字继续发送文件数据。
示例:
Server: ..., -75, 82, 34, -109, 50, -51, 52, 9, -14, -70,...
Client: ..., -75, 82, 34, -109, 50, 0, 0, 0, 0, 0,...
不过过了一会儿就恢复了
..., 0, 0, 0, 0, 0, -51, 52, 9, -14, -70,...
您会注意到它会从中断处继续。唯一的问题是现在我的文件中有一堆零,流的结尾不会被记录到文件中(因为文件长度是提前发送的)。
注意:这似乎只在某些时候发生(经常发生)
流代码本身:
发件人:
<header stuff, I checked it works fine>
long dataLeft = 0;
while(dataLeft < packet.payloadSize){
packet.remaining = packet.payloadSize-dataLeft;
byte[] temp = new byte[packet.remaining<8192?(int)packet.remaining:8192];
packet.inStream.read(temp);
stream.write(temp);
dataLeft+=temp.length;
}
stream.flush();
<Rest of the code>
接收者:
public boolean streamPayload(OutputStream out) throws IOException{
long dataLeft = 0;
while(dataLeft < payloadSize){
remaining = payloadSize-dataLeft;
byte[] temp = new byte[remaining<8192?(int)remaining:8192];
inStream.read(temp);
out.write(temp);
dataLeft+=temp.length;
}
return true;
}
long dataLeft
作为索引 btw。
有谁知道为什么会发生这种情况以及我该如何解决 it/compensate 这个问题?我知道我无法判断是否有意为零,所以我不能只通过观察输出来听取问题。
我不知道这是否能解决您的问题,但您做错的一件事是忽略了传输的数据量。
InputStream in = //from somewhere
OutputStream out = //to somewhere
byte[] buffer = new byte[8192];
int read = -1;
while ((read = in.read(buffer)) > -1) {
out.write(buffer, 0, read);
}
out.close();
int.close();
您可能在没有收到任何数据的情况下读取数据,然后写入 8192 字节的空缓冲区,因为您没有检查是否有任何数据通过。
我一直在编写一个简单的文件传输程序,它打开到服务器的 TCP 连接,协商文件传输的条款(通过 TCP)并将文件从客户端流式传输到服务器。问题是大文件几乎总是损坏。我记录了套接字 InputStream
和 OutputStream
,发现虽然数据一开始是匹配的,但在几千字节之后发生了有趣的不同步。
在某个时刻,接收套接字开始读取 0
,而发送套接字继续发送文件数据。
示例:
Server: ..., -75, 82, 34, -109, 50, -51, 52, 9, -14, -70,...
Client: ..., -75, 82, 34, -109, 50, 0, 0, 0, 0, 0,...
不过过了一会儿就恢复了
..., 0, 0, 0, 0, 0, -51, 52, 9, -14, -70,...
您会注意到它会从中断处继续。唯一的问题是现在我的文件中有一堆零,流的结尾不会被记录到文件中(因为文件长度是提前发送的)。
注意:这似乎只在某些时候发生(经常发生)
流代码本身:
发件人:
<header stuff, I checked it works fine>
long dataLeft = 0;
while(dataLeft < packet.payloadSize){
packet.remaining = packet.payloadSize-dataLeft;
byte[] temp = new byte[packet.remaining<8192?(int)packet.remaining:8192];
packet.inStream.read(temp);
stream.write(temp);
dataLeft+=temp.length;
}
stream.flush();
<Rest of the code>
接收者:
public boolean streamPayload(OutputStream out) throws IOException{
long dataLeft = 0;
while(dataLeft < payloadSize){
remaining = payloadSize-dataLeft;
byte[] temp = new byte[remaining<8192?(int)remaining:8192];
inStream.read(temp);
out.write(temp);
dataLeft+=temp.length;
}
return true;
}
long dataLeft
作为索引 btw。
有谁知道为什么会发生这种情况以及我该如何解决 it/compensate 这个问题?我知道我无法判断是否有意为零,所以我不能只通过观察输出来听取问题。
我不知道这是否能解决您的问题,但您做错的一件事是忽略了传输的数据量。
InputStream in = //from somewhere
OutputStream out = //to somewhere
byte[] buffer = new byte[8192];
int read = -1;
while ((read = in.read(buffer)) > -1) {
out.write(buffer, 0, read);
}
out.close();
int.close();
您可能在没有收到任何数据的情况下读取数据,然后写入 8192 字节的空缓冲区,因为您没有检查是否有任何数据通过。