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?
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