Trouble sending files over the network.
I have a network application that corrupts any files that it sends, although the received file is very close (but never exact) to the number of bytes it should be. There is a socket client that each client has, and the Packet data structure is searializable and simply contains a string message and the byte[]. Am I doing something wrong?
Here is my code for Sending:
ObjectOutputStream toOtherClient =new ObjectOutputStream(client.getOutputStream());
ObjectInputStream fromOtherClient =new ObjectInputStream(client.getInputStream());
Packet fileRequest = (Packet)fromOtherClient.readObject();
File file =new File(DefaultConfig.defaultFileDirectory+"\\"+fileRequest.getMessage());
FileInputStream fromDisk =new FileInputStream(file);
BufferedInputStream fromDiskBuffered =new BufferedInputStream(fromDisk);
byte[] buffer =newbyte[maxPayload];
while(fromDiskBuffered.available() > 0)
{
if (fromDisk.available() > maxPayload)
{
fromDiskBuffered.read(buffer);
toOtherClient.writeObject(new Packet(Packet.Command.File,"",buffer));
}
else
{
buffer =newbyte[fromDiskBuffered.available()];
fromDiskBuffered.read(buffer);
toOtherClient.writeObject(new Packet(Packet.Command.File,"",buffer));
}
}
fromDiskBuffered.close();
fromDisk.close();
toOtherClient.writeObject(new Packet(Packet.Command.File,"ack"));
fromOtherClient.close();
toOtherClient.close();
client.close();
Here is my code for recieving:
Socket client =new Socket(host, Integer.parseInt(port));
ObjectOutputStream toOtherClient =new ObjectOutputStream(client.getOutputStream());
ObjectInputStream fromOtherClient =new ObjectInputStream(client.getInputStream());
FileOutputStream toDisk =new FileOutputStream(DefaultConfig.defaultFileDirectory+"//"+whatFile); BufferedOutputStream toDiskBuffered =new BufferedOutputStream(toDisk);
toOtherClient.writeObject(new Packet(Packet.Command.File,whatFile));
Packet incoming;
while(true)
{
incoming = (Packet)fromOtherClient.readObject();
if (incoming.getMessage().equals("ack"))
{
break;
}
byte[] fileData = (byte[])incoming.getData();
toDiskBuffered.write(fileData);
}
toDiskBuffered.flush();
toDiskBuffered.close();
toDisk.close();
fromOtherClient.close();
toOtherClient.close();
client.close();

