Когда я передаю большой файл с помощью сокет-программирования, полученный файл является неполным, то есть это mp3-файл, который, когда я играю, звучит странно.
Код:
Серверная часть:
File myFile = new File("abc.mp3");
{
Socket sock = servsock.accept();
int packetsize=1024;
double nosofpackets=Math.ceil(((int) myFile.length())/packetsize);
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
for(double i=0;i<nosofpackets+1;i++) {
byte[] mybytearray = new byte[packetsize];
bis.read(mybytearray, 0, mybytearray.length);
System.out.println("Packet:"+(i+1));
OutputStream os = sock.getOutputStream();
os.write(mybytearray, 0,mybytearray.length);
os.flush();
}
}
Клиентская сторона:
int packetsize=1024;
FileOutputStream fos = new FileOutputStream("zz.mp3");
BufferedOutputStream bos = new BufferedOutputStream(fos);
double nosofpackets=Math.ceil(((int) (new File("abc.mp3")).length())/packetsize);
for(double i=0;i<nosofpackets+1;i++)
{
InputStream is = sock.getInputStream();
byte[] mybytearray = new byte[packetsize];
int bytesRead = is.read(mybytearray, 0,mybytearray.length );
System.out.println("Packet:"+(i+1));
bos.write(mybytearray, 0,mybytearray.length);
}
sock.close();
bos.close();
На стороне клиента я использовал new File("abc.mp3")).length
просто для простоты (я мог бы отправить длину файла со стороны сервера).
Этот код отлично работает, если клиент и сервер - одна и та же машина, но файл искажается, если они находятся на разных машинах.