java - 套接字批量读取返回一个零数组

标签 java sockets tcp file-transfer

我一直在编写一个简单的文件传输程序,它打开到服务器的 TCP 连接,协商文件传输条款(通过 TCP)并将文件从客户端流式传输到服务器。问题是大文件几乎总是损坏。我记录了套接字 InputStreamOutputStream 并发现,虽然数据一开始匹配,但在几千字节之后,发生了有趣的不同步。

在某个时刻,接收套接字开始读取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 充当索引顺便说一句。

有谁知道为什么会发生这种情况以及如何解决/补偿该问题?我知道我无法判断是否有意为零,因此我不能仅通过观察输出来监听问题。

最佳答案

我不知道这是否能解决您的问题,但您做错的一件事是忽略传输的数据量。

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 字节缓冲区,因为您没有检查是否有任何数据通过。

关于java - 套接字批量读取返回一个零数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36849812/

相关文章:

java - PhantomJS:page.onError - 消息:TypeError:未定义不是函数

sockets - 仅在混杂模式下接收的 UDP 数据包

sockets - 我需要心跳来保持 TCP 连接打开吗?

c# - RDP 到 HTTP 转换

tcp - dbus-发送到远程机器

java - 从文件中读取数据并将其添加到数据库中,但不添加相同的值

java - TextView 不在应用程序中居中,但在 match_constraint 中居中

java - 将 ascii 数字数组转换为各自的字符

java - 如何在 Android 上解锁 InputStream.read()?

java - 最佳实践 : Unit testing a method that takes in a Socket as an argument?