DataInputStream получает неточный

Эта проблема действительно вызывает у меня головную боль. Очень простой сценарий. Отправлять и получать файлы по TCP с помощью DataInputStream.

это метод записи

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;
    }
}

И это выход

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

Все кажется хорошо до сих пор. Проблема в чтении данных.

Вот как я читаю

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;
    }
}

А это результат приема

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

А на стороне клиента пишет, что файл отправлен. Но серверная часть все еще ждет, пока я сравню filesize == totalRead Проблема в том, почему сервер получает больше, чем я отправил? Разве это не точно такое же количество байтов, которое нужно получить?

Странно то, что когда я завершаю приложение, записанный файл составляет около 16 МБ. Определенно что-то не так с тем, как я обращаюсь с принимающей стороной. Мне нужно немного помощи здесь.

РЕДАКТИРОВАТЬ Насчет записи 16 МБ на вывод я только что разобрался. Я записываю весь буфер независимо от того, сколько я читаю. Поэтому я изменил приведенную выше строку

outputStream.write(readBuffer);

нравится

outputStream.write(readBuffer, 0, read);

Моя проблема все еще сохраняется. Как я не получаю количество байтов? Я получаю больше, чем отправляю. Любая подсказка?


person OmerHalit    schedule 05.07.2014    source источник
comment
Вы внесли такое же изменение в свой метод записи? dataOStream.write(buffer, 0, write);   -  person Alex - GlassEditor.com    schedule 05.07.2014
comment
@ Алекс это было. действительно спасибо.   -  person OmerHalit    schedule 05.07.2014


Ответы (1)


Оба ваших цикла копирования неверны. Цикл отправки должен выглядеть так:

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

В противном случае вы пишете мусор как минимум в конце файла, а возможно, и в другое время.

Ваш цикл приема должен останавливаться после чтения точного количества байтов, поэтому это немного сложнее:

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

Э&ОЕ

person user207421    schedule 05.07.2014
comment
Вы знаете, что, учитывая последний ответ на этот вопрос link , Я думаю, что иметь счет в банке было бы неплохо для вас. Я был просто слеп, чтобы увидеть свою отправляющую часть. О.. Еще одна вещь, в приемной части, для чтения (буфер, 0, количество), не можем ли мы ожидать, что будет прочитано такое же количество байтов, потому что при отправке я все-таки использую флеш? TCP гарантирует доставку и заказ, разве не нужно использовать min(число, число)? почему бы просто не прочитать (буфер)? - person OmerHalit; 05.07.2014
comment
flush() не имеет к этому никакого отношения. Нужно прочитать ровно столько ожидаемых байтов, не больше. Если вы не используете выражение Math.min(), вы будете перечитывать, что и является проблемой, о которой вы сообщили. Проработайте код и выясните, почему все находится там, где оно есть. Он очень хорошо протестирован и появляется в десятках ответов здесь. - person user207421; 05.07.2014
comment
тогда я могу просто удалить условие if в цикле получения, верно? А некоторые говорят (в других ответах), что флеш не нужен ни при чтении, ни при отправке. так что я должен только закрыть? - person OmerHalit; 05.07.2014
comment
Правильно, удалите if и просто закройте в конце. «Если» выполняет ту же работу, что и условие while и выражение Math.min(), но делает это неправильно и слишком поздно. - person user207421; 05.07.2014
comment
Исправлено это, чтобы не использовать Math.min(), который потенциально может столкнуться с целочисленным переполнением. - person user207421; 26.11.2014