Transferencia de Arquivos via soket

Boa tarde pessoal implementei uma solução em Socket para transferir um arquivo do Servidor Socket pra aplicação cliente Socket está funcionando corretamente porem o tamanho do arquivo final fica diferente do arquivo original, o que pode ser ?
Segue minha implementação

Client Socket

//importacao das classes net (pilha TCP/IP) e io (entrada e saida) 
 import java.io.FileOutputStream;
 import java.io.DataInputStream;
 import java.net.*;

public class ClienteFTP {

    public static void  main(String[] args) throws Exception {

     Socket socket = new Socket("localhost", 13);

     System.out.println("Conectado: " + socket.isConnected());
     //FileOuputStream para salvar o arquivo recebido
     FileOutputStream sarq = new FileOutputStream("C:/Files/Baixados/F2.txt");
     // DataInputStream para processar os bytes recebidos
     DataInputStream entrada = new DataInputStream(socket.getInputStream());

     byte[] br = new byte[2048];

     int leitura = entrada.read(br);

     while(leitura != -1) {
     
        if(leitura != -2) {
            sarq.write(br, 0, leitura);
         }
        
        leitura = entrada.read(br);
        }     
    socket.close();
    entrada.close();
    sarq.close();
    }
}

Server Socket

import java.net.*;
import java.io.*;

public class ServerFTP {

       public  static void main(String[] args) {
 
         
        try {
            //cria o objeto socket servidor para a porta 13
            ServerSocket server = new ServerSocket(13);
            //aceita a conexao socket
            Socket clSocket = server.accept();

            System.out.println("Conexao aceita por: " + clSocket.getInetAddress().getHostName());

            File f1 = new File("C:/Files/ServFile/F2.txt");
      
            DataOutputStream out = new DataOutputStream (clSocket.getOutputStream());

            /* abrir arquivo para o envio  */
            FileInputStream fin = new FileInputStream (f1);
            DataInputStream in = new DataInputStream (fin);

            /* cria um buffer de 512 bytes para o envio */
            byte[] buffer = new byte[2048];
            //int cont =0;
            /* envia os dados :) */
            while (in.read(buffer) != -1) {
                out.write(buffer,0,buffer.length);
            }

            fin.close();
            out.flush();
            out.close();
            }catch (Exception e){
                System.out.println(e);
                System.exit(0);
            } finally {                
            }

        }

}

o que devo fazer para que o arquivo final fique exatamente igual ao original ?

desde ja agradeço

Não sei se e isso não, mas como vc define um buffer, um array de byte vc esta sempre enviando ele, mas na ultima vez pode ser que vc esta preenchendo ele um pouco e o restante das posições fica com lixo, tente diminuir a vetor br provavelmente essa diferença vai cair. Flw