Ho scritto del codice che mi permette di trasferire un file da un server ad un client, solo che nonostante il file arrivi sempre e correttamente a destinazione alcune volte me lo visualizza bene (è un JPG ma può essere qualunque cosa) ed altre non me lo visualizza proprio (File troppo grande o danneggiato).

Da che può dipendere? Vi scrivo il codice che ho implementato.

Lato Server
codice:
public class ServerP2P
{
    private ServerSocket server;
    private Socket connessione;
    private String nome;
    
    public ServerP2P (String nome) throws IOException
    {
        this.nome = nome;
        ServerSocket server = new ServerSocket (7778);
        System.out.println ("ServerSocket per il P2P avviato tramite Transfer Thread");
        
        try
        {
            while(true)
            {
                connessione = server.accept ();
                P2PHandler c = new P2PHandler (connessione);
                c.start ();
            }
        }
        catch (Exception e )
        {
            e.printStackTrace ();
        }
    }
}
codice:
public class P2PHandler extends Thread 
{
    private Socket s;
    private File f;
    private int dimension;
    private byte [] data;
    
    public P2PHandler (Socket s) throws IOException 
    {
        this.s = s;
    }
    
    public void run () 
    {
        try 
        {
            f = new File ("Files\\Prova.jpg");
            dimension = (int)f.length();
            data = new byte [dimension];
            
            while (true)
            {
                FileInputStream fis = new FileInputStream (f);
                DataOutputStream opt = new DataOutputStream (s.getOutputStream());
                fis.read (data, 0, dimension);
                opt.write (data, 0, dimension);
                opt.close ();
                fis.close ();
            }
        } 
        catch (IOException ex) 
        {
            ex.printStackTrace ();
        } 
    }
}
Lato Client
codice:
public class ClientP2P implements Runnable
{
    private Socket connessione;
    private Thread listener;
    
    public ClientP2P (String indirizzo)
    {
        try 
        {
            connessione = new Socket (InetAddress.getByName (indirizzo), 7778);
         }
        catch (ConnectException q)
        {
            System.out.println (Eccezione di tipo CONNECT !!!);
        }
        catch (NullPointerException w)
        {
            System.out.println ("Eccezione di tipo NULLPOINTER !!!");
        }
        catch (IOException e) 
        {
            System.out.println ("Eccezione di tipo IO !!!");
        }
        
        listener = new Thread (this);
        listener.start ();
    }
    
    public void run ()
    {
        try
        {
            FileOutputStream fos = new FileOutputStream ("FileRicevuto.jpg");
            DataInputStream dis = new DataInputStream (connessione.getInputStream ());
            byte b [] = new byte [1024];
            while (dis.read (b) != -1)
            {
                fos.write (b);
            }
      
            dis.close ();
            fos.close ();
            connessione.close ();
        }
        catch (Exception e)
        {
            System.out.println (e);
        }
    }
}