Search code examples
javasocketsdatainputstream

DataInputStream receives inaccurate


This problem is really giving me headache. Very simple scenario. Send and receive file over TCP using DataInputStream.

This is the write method

private boolean send(File file)
{
    try {
        FileInputStream fileIStream = new FileInputStream(file);
        BufferedInputStream bufferedIStream = new BufferedInputStream(fileIStream);
        DataInputStream dataIStream = new DataInputStream(bufferedIStream);
        byte [] buffer = new byte [sendBufferSize];

        dataOStream.writeInt(ID);
        dataOStream.writeUTF(file.getName());
        dataOStream.writeLong(file.length());
        dataOStream.writeUTF(data1);
        dataOStream.writeUTF(data2);
        dataOStream.writeInt(number1);
        //dataOStream.flush(); tried to flush here if writing data might be the problem

        int write, total=0;
        //Starting to send
        while((write = dataIStream.read(buffer)) >= 0)
        {
            dataOStream.write(buffer);
            total+=write;
            System.out.println("size: " + file.length() + "  write: " + write + "  total: " + total);
        }
        dataIStream.close();
        dataOStream.flush();
        return true;
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

And this is the output

size: 1830918  write: 8192  total: 8192
size: 1830918  write: 8192  total: 16384  
size: 1830918  write: 8192 total: 24576  
size: 1830918  write: 8192  total: 32768  
size: 1830918  write: 8192  total: 40960  
size: 1830918  write: 8192  total: 49152 
size: 1830918  write: 8192  total: 57344  
size: 1830918  write: 8192  total: 65536  
...............  
............... 
...............  
size: 1830918  write: 8192  total: 1802240  
size: 1830918  write: 8192  total: 1810432  
size: 1830918  write: 8192  total: 1818624  
size: 1830918  write: 8192  total: 1826816  
size: 1830918  write: 4102  total: 1830918

Everything seems fine until now. The problem is with reading the data.

Here is how I read

private boolean receiveBinary()
{
    try {
        final int ID = dataIStream.readInt();

            final String fileName = dataIStream.readUTF();
            final long fileSize = dataIStream.readLong();
            final String data1 = dataIStream.readUTF();
            final String data2 = dataIStream.readUTF();
            final int number1 = dataIStream.readInt();
            //I printed out these data and everything is fine until here. No corruption or no missing.

            int read, totalRead = 0;
            File outputFile = createFile();
            OutputStream outputStream = new FileOutputStream(outputFile);

            try {
                byte [] readBuffer = new byte[readBufferSize];
                while ((read = dataIStream.read(readBuffer)) > 0) {
                    outputStream.write(readBuffer);
                    readBuffer = new byte[readBufferSize];
                    totalRead += read;
                    System.out.println("size: " + fileSize + "  read: " + read + "  total: " + totalRead);
                    if (totalRead == fileSize) {
                        outputStream.flush();
                        outputStream.close();
                        break;
                    }
                }
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        }
    }
    catch (IOException e) {
        e.printStackTrace();
        return false;
    }
}

And this is the output from receiving

size: 1830918  read: 34228  total: 34228
size: 1830918  read: 2920  total: 37148
size: 1830918  read: 3812  total: 40960
size: 1830918  read: 1460  total: 42420
size: 1830918  read: 6732  total: 49152
size: 1830918  read: 2920  total: 52072
size: 1830918  read: 5272  total: 57344
size: 1830918  read: 8192  total: 65536
size: 1830918  read: 8192  total: 73728
size: 1830918  read: 1460  total: 75188
size: 1830918  read: 6732  total: 81920
size: 1830918  read: 1460  total: 83380
size: 1830918  read: 6732  total: 90112
size: 1830918  read: 1460  total: 91572
size: 1830918  read: 6732  total: 98304
size: 1830918  read: 8192  total: 106496
size: 1830918  read: 1460  total: 107956
size: 1830918  read: 1460  total: 109416
size: 1830918  read: 5272  total: 114688
size: 1830918  read: 1460  total: 116148
size: 1830918  read: 6732  total: 122880
size: 1830918  read: 8192  total: 131072
size: 1830918  read: 8192  total: 139264
size: 1830918  read: 8192  total: 147456
size: 1830918  read: 1460  total: 148916
size: 1830918  read: 6732  total: 155648
size: 1830918  read: 8192  total: 163840
size: 1830918  read: 8192  total: 172032
size: 1830918  read: 8192  total: 180224
size: 1830918  read: 1460  total: 181684
size: 1830918  read: 6732  total: 188416
size: 1830918  read: 8192  total: 196608
size: 1830918  read: 8192  total: 204800
size: 1830918  read: 1460  total: 206260
size: 1830918  read: 6732  total: 212992
size: 1830918  read: 8192  total: 221184
size: 1830918  read: 8192  total: 229376
size: 1830918  read: 8192  total: 237568
size: 1830918  read: 8192  total: 245760
size: 1830918  read: 1460  total: 247220
size: 1830918  read: 6732  total: 253952
size: 1830918  read: 1460  total: 255412
size: 1830918  read: 6732  total: 262144
size: 1830918  read: 8192  total: 270336
size: 1830918  read: 1460  total: 271796
size: 1830918  read: 6732  total: 278528
size: 1830918  read: 1460  total: 279988
size: 1830918  read: 6732  total: 286720
size: 1830918  read: 8192  total: 294912
size: 1830918  read: 1460  total: 296372
size: 1830918  read: 6732  total: 303104
size: 1830918  read: 16384  total: 319488
size: 1830918  read: 8192  total: 327680
size: 1830918  read: 1460  total: 329140
size: 1830918  read: 6732  total: 335872
size: 1830918  read: 8192  total: 344064
size: 1830918  read: 1460  total: 345524
size: 1830918  read: 6732  total: 352256
size: 1830918  read: 8192  total: 360448
size: 1830918  read: 8192  total: 368640
size: 1830918  read: 8192  total: 376832
size: 1830918  read: 8192  total: 385024
size: 1830918  read: 8192  total: 393216
size: 1830918  read: 8192  total: 401408
size: 1830918  read: 8192  total: 409600
size: 1830918  read: 1460  total: 411060
size: 1830918  read: 6732  total: 417792
size: 1830918  read: 8192  total: 425984
size: 1830918  read: 8192  total: 434176
size: 1830918  read: 8192  total: 442368
size: 1830918  read: 8192  total: 450560
size: 1830918  read: 8192  total: 458752
size: 1830918  read: 8192  total: 466944
size: 1830918  read: 8192  total: 475136
size: 1830918  read: 1460  total: 476596
size: 1830918  read: 6732  total: 483328
size: 1830918  read: 1460  total: 484788
size: 1830918  read: 6732  total: 491520
size: 1830918  read: 1460  total: 492980
size: 1830918  read: 6732  total: 499712
size: 1830918  read: 8192  total: 507904
size: 1830918  read: 8192  total: 516096
size: 1830918  read: 8192  total: 524288
size: 1830918  read: 8192  total: 532480
size: 1830918  read: 8192  total: 540672
size: 1830918  read: 8192  total: 548864
size: 1830918  read: 1460  total: 550324
size: 1830918  read: 6732  total: 557056
size: 1830918  read: 1460  total: 558516
size: 1830918  read: 6732  total: 565248
size: 1830918  read: 1460  total: 566708
size: 1830918  read: 6732  total: 573440
size: 1830918  read: 8192  total: 581632
size: 1830918  read: 8192  total: 589824
size: 1830918  read: 8192  total: 598016
size: 1830918  read: 8192  total: 606208
size: 1830918  read: 8192  total: 614400
size: 1830918  read: 1460  total: 615860
size: 1830918  read: 6732  total: 622592
size: 1830918  read: 8192  total: 630784
size: 1830918  read: 8192  total: 638976
size: 1830918  read: 8192  total: 647168
size: 1830918  read: 8192  total: 655360
size: 1830918  read: 8192  total: 663552
size: 1830918  read: 8192  total: 671744
size: 1830918  read: 1460  total: 673204
size: 1830918  read: 6732  total: 679936
size: 1830918  read: 1460  total: 681396
size: 1830918  read: 1460  total: 682856
size: 1830918  read: 1460  total: 684316
size: 1830918  read: 3812  total: 688128
size: 1830918  read: 8192  total: 696320
size: 1830918  read: 1460  total: 697780
size: 1830918  read: 6732  total: 704512
size: 1830918  read: 8192  total: 712704
size: 1830918  read: 8192  total: 720896
size: 1830918  read: 8192  total: 729088
size: 1830918  read: 8192  total: 737280
size: 1830918  read: 8192  total: 745472
size: 1830918  read: 8192  total: 753664
size: 1830918  read: 8192  total: 761856
size: 1830918  read: 8192  total: 770048
size: 1830918  read: 8192  total: 778240
size: 1830918  read: 8192  total: 786432
size: 1830918  read: 8192  total: 794624
size: 1830918  read: 8192  total: 802816
size: 1830918  read: 1460  total: 804276
size: 1830918  read: 6732  total: 811008
size: 1830918  read: 1460  total: 812468
size: 1830918  read: 6732  total: 819200
size: 1830918  read: 8192  total: 827392
size: 1830918  read: 1460  total: 828852
size: 1830918  read: 6732  total: 835584
size: 1830918  read: 8192  total: 843776
size: 1830918  read: 1460  total: 845236
size: 1830918  read: 1460  total: 846696
size: 1830918  read: 5272  total: 851968
size: 1830918  read: 8192  total: 860160
size: 1830918  read: 8192  total: 868352
size: 1830918  read: 8192  total: 876544
size: 1830918  read: 1460  total: 878004
size: 1830918  read: 6732  total: 884736
size: 1830918  read: 8192  total: 892928
size: 1830918  read: 1460  total: 894388
size: 1830918  read: 6732  total: 901120
size: 1830918  read: 4380  total: 905500
size: 1830918  read: 1460  total: 906960
size: 1830918  read: 2352  total: 909312
size: 1830918  read: 8192  total: 917504
size: 1830918  read: 8192  total: 925696
size: 1830918  read: 1460  total: 927156
size: 1830918  read: 6732  total: 933888
size: 1830918  read: 1460  total: 935348
size: 1830918  read: 6732  total: 942080
size: 1830918  read: 8192  total: 950272
size: 1830918  read: 8192  total: 958464
size: 1830918  read: 8192  total: 966656
size: 1830918  read: 8192  total: 974848
size: 1830918  read: 8192  total: 983040
size: 1830918  read: 1460  total: 984500
size: 1830918  read: 6732  total: 991232
size: 1830918  read: 8192  total: 999424
size: 1830918  read: 1460  total: 1000884
size: 1830918  read: 1460  total: 1002344
size: 1830918  read: 5272  total: 1007616
size: 1830918  read: 8192  total: 1015808
size: 1830918  read: 8192  total: 1024000
size: 1830918  read: 8192  total: 1032192
size: 1830918  read: 8192  total: 1040384
size: 1830918  read: 8192  total: 1048576
size: 1830918  read: 8192  total: 1056768
size: 1830918  read: 8192  total: 1064960
size: 1830918  read: 8192  total: 1073152
size: 1830918  read: 8192  total: 1081344
size: 1830918  read: 1460  total: 1082804
size: 1830918  read: 1460  total: 1084264
size: 1830918  read: 5272  total: 1089536
size: 1830918  read: 1460  total: 1090996
size: 1830918  read: 1460  total: 1092456
size: 1830918  read: 5272  total: 1097728
size: 1830918  read: 8192  total: 1105920
size: 1830918  read: 8192  total: 1114112
size: 1830918  read: 1460  total: 1115572
size: 1830918  read: 6732  total: 1122304
size: 1830918  read: 8192  total: 1130496
size: 1830918  read: 1460  total: 1131956
size: 1830918  read: 1460  total: 1133416
size: 1830918  read: 5272  total: 1138688
size: 1830918  read: 8192  total: 1146880
size: 1830918  read: 8192  total: 1155072
size: 1830918  read: 1460  total: 1156532
size: 1830918  read: 1460  total: 1157992
size: 1830918  read: 5272  total: 1163264
size: 1830918  read: 8192  total: 1171456
size: 1830918  read: 8192  total: 1179648
size: 1830918  read: 8192  total: 1187840
size: 1830918  read: 8192  total: 1196032
size: 1830918  read: 1460  total: 1197492
size: 1830918  read: 6732  total: 1204224
size: 1830918  read: 1460  total: 1205684
size: 1830918  read: 1460  total: 1207144
size: 1830918  read: 5272  total: 1212416
size: 1830918  read: 8192  total: 1220608
size: 1830918  read: 8192  total: 1228800
size: 1830918  read: 8192  total: 1236992
size: 1830918  read: 4380  total: 1241372
size: 1830918  read: 3812  total: 1245184
size: 1830918  read: 8192  total: 1253376
size: 1830918  read: 1460  total: 1254836
size: 1830918  read: 6732  total: 1261568
size: 1830918  read: 8192  total: 1269760
size: 1830918  read: 8192  total: 1277952
size: 1830918  read: 8192  total: 1286144
size: 1830918  read: 1460  total: 1287604
size: 1830918  read: 6732  total: 1294336
size: 1830918  read: 8192  total: 1302528
size: 1830918  read: 1460  total: 1303988
size: 1830918  read: 6732  total: 1310720
size: 1830918  read: 1460  total: 1312180
size: 1830918  read: 6732  total: 1318912
size: 1830918  read: 8192  total: 1327104
size: 1830918  read: 8192  total: 1335296
size: 1830918  read: 1460  total: 1336756
size: 1830918  read: 6732  total: 1343488
size: 1830918  read: 1460  total: 1344948
size: 1830918  read: 6732  total: 1351680
size: 1830918  read: 8192  total: 1359872
size: 1830918  read: 8192  total: 1368064
size: 1830918  read: 8192  total: 1376256
size: 1830918  read: 8192  total: 1384448
size: 1830918  read: 8192  total: 1392640
size: 1830918  read: 8192  total: 1400832
size: 1830918  read: 8192  total: 1409024
size: 1830918  read: 8192  total: 1417216
size: 1830918  read: 8192  total: 1425408
size: 1830918  read: 8192  total: 1433600
size: 1830918  read: 1460  total: 1435060
size: 1830918  read: 1460  total: 1436520
size: 1830918  read: 5272  total: 1441792
size: 1830918  read: 1460  total: 1443252
size: 1830918  read: 1460  total: 1444712
size: 1830918  read: 5272  total: 1449984
size: 1830918  read: 8192  total: 1458176
size: 1830918  read: 8192  total: 1466368
size: 1830918  read: 1460  total: 1467828
size: 1830918  read: 6732  total: 1474560
size: 1830918  read: 8192  total: 1482752
size: 1830918  read: 1460  total: 1484212
size: 1830918  read: 6732  total: 1490944
size: 1830918  read: 8192  total: 1499136
size: 1830918  read: 1460  total: 1500596
size: 1830918  read: 6732  total: 1507328
size: 1830918  read: 1460  total: 1508788
size: 1830918  read: 6732  total: 1515520
size: 1830918  read: 1460  total: 1516980
size: 1830918  read: 1460  total: 1518440
size: 1830918  read: 5272  total: 1523712
size: 1830918  read: 8192  total: 1531904
size: 1830918  read: 1460  total: 1533364
size: 1830918  read: 6732  total: 1540096
size: 1830918  read: 8192  total: 1548288
size: 1830918  read: 5840  total: 1554128
size: 1830918  read: 2352  total: 1556480
size: 1830918  read: 8192  total: 1564672
size: 1830918  read: 8192  total: 1572864
size: 1830918  read: 8192  total: 1581056
size: 1830918  read: 8192  total: 1589248
size: 1830918  read: 8192  total: 1597440
size: 1830918  read: 1460  total: 1598900
size: 1830918  read: 6732  total: 1605632
size: 1830918  read: 8192  total: 1613824
size: 1830918  read: 8192  total: 1622016
size: 1830918  read: 8192  total: 1630208
size: 1830918  read: 8192  total: 1638400
size: 1830918  read: 1460  total: 1639860
size: 1830918  read: 1460  total: 1641320
size: 1830918  read: 5272  total: 1646592
size: 1830918  read: 8192  total: 1654784
size: 1830918  read: 1460  total: 1656244
size: 1830918  read: 6732  total: 1662976
size: 1830918  read: 8192  total: 1671168
size: 1830918  read: 8192  total: 1679360
size: 1830918  read: 1460  total: 1680820
size: 1830918  read: 6732  total: 1687552
size: 1830918  read: 8192  total: 1695744
size: 1830918  read: 1460  total: 1697204
size: 1830918  read: 6732  total: 1703936
size: 1830918  read: 8192  total: 1712128
size: 1830918  read: 8192  total: 1720320
size: 1830918  read: 8192  total: 1728512
size: 1830918  read: 8192  total: 1736704
size: 1830918  read: 1460  total: 1738164
size: 1830918  read: 6732  total: 1744896
size: 1830918  read: 1460  total: 1746356
size: 1830918  read: 1460  total: 1747816
size: 1830918  read: 5272  total: 1753088
size: 1830918  read: 8192  total: 1761280
size: 1830918  read: 8192  total: 1769472
size: 1830918  read: 1460  total: 1770932
size: 1830918  read: 1460  total: 1772392
size: 1830918  read: 5272  total: 1777664
size: 1830918  read: 1460  total: 1779124
size: 1830918  read: 1460  total: 1780584
size: 1830918  read: 5272  total: 1785856
size: 1830918  read: 8192  total: 1794048
size: 1830918  read: 8192  total: 1802240
size: 1830918  read: 8192  total: 1810432
size: 1830918  read: 8192  total: 1818624
size: 1830918  read: 1460  total: 1820084
size: 1830918  read: 6732  total: 1826816
size: 1830918  read: 1460  total: 1828276
size: 1830918  read: 1460  total: 1829736
size: 1830918  read: 5272  total: 1835008

And in the client side, it says file sent. But server side still waits as I make the comparison filesize == totalRead The problem is, how come the server receives more than I sent? Isn't that exactly the same amount of bytes to be received?

The weird thing is, when I terminate the app, the written file is about ~16MB. There is definitely something wrong with how I handle receiving part. I need some help here.

EDIT About writing 16MB to output, I just figured out. I am writing the entire buffer regardless of how much I read. So I modified the above line

outputStream.write(readBuffer);

like this

outputStream.write(readBuffer, 0, read);

My problem still persists. How I am not receiving the amount of bytes? I receive more than I send. Any clue?


Solution

  • Your copy loops are both wrong. The send loop should look like this:

    while ((count = in.read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }
    

    Otherwise you are writing junk at least at the end of the file, and possibly other times as well.

    Your receive loop needs to stop after reading exactly the right number of bytes, so it is a little more complicated:

    while (total < length && (count = in.read(buffer, 0, (int)Math.min(buffer.length, length-total))) > 0)
    {
        out.write(buffer, 0, count);
        total += count;
    }
    

    E&OE