Buongiorno! Da qualche giorno ho un problema con UDP.
Ho un client che manda un oggetto e un file. Il server deve ricevere l'oggetto e successivamente il file.
Il problema è che quando dal client mando un secondo oggetto e quindi un secondo file il server lancia una StreamCorruptedException.

Client:
codice:
public class SenderUDP implements Runnable {
    private java.net.DatagramSocket clientsocket;
    private ObjectOutputStream out;
    private int port;
    private InetAddress ip;
    private Packet objToSend;
    private ByteArrayOutputStream baos;
   
    
    public SenderUDP(String ip, int port, Packet p) throws UnknownHostException{
        this.ip =InetAddress.getByName(ip);
        this.port = port;
        this.objToSend = p;
        this.out = null;
        this.clientsocket = null;
    }
    
    @Override
    public void run(){
        try{
            clientsocket = new DatagramSocket ();
            System.out.println("Sono dentro il senderUDP");
            byte[] sendData;                    
            baos = new ByteArrayOutputStream(1024);
            out = new ObjectOutputStream(baos);
            out.writeObject(objToSend);
            sendData = baos.toByteArray();           
            //Invio un pacchetto che contiene sendData byte, di lunghezza sendData.lenght, con ip e porta
            DatagramPacket sendpacket = new DatagramPacket(sendData,sendData.length,ip,port);            
            clientsocket.send(sendpacket);                 
            System.out.println("Ho mandato il pacchetto con UDP");
            out.flush();
            if(this.objToSend.getOP() == 1){
                byte[] buf = new byte[1024];                
                int read;
                ByteArrayOutputStream bas = new ByteArrayOutputStream((int)this.objToSend.getFile().length());                
                FileInputStream fis = new FileInputStream(objToSend.getFile());
                while((read = fis.read(buf)) != -1){
                    bas.write(buf, 0, read);
                }
                DatagramPacket sendfile = new DatagramPacket(bas.toByteArray(), bas.toByteArray().length, ip, port);
                clientsocket.send(sendfile);
            }           
            out.close();             
        }
        catch(UnknownHostException uhe) {
            System.err.println(uhe.getMessage());
        }
        catch(IOException ioe) {
            System.err.println(ioe.getMessage());
        }
    }
}
Server:
codice:
class ServerUDP implements Runnable {
    private DatagramSocket socket;
    private int port;
    private Controller controller;
    private byte[] buffer;
    private DatagramPacket packet;
    private Packet p;
    private ObjectInputStream ois;
    
    public ServerUDP(int port, Controller controller){
        this.socket = null;
        this.port = port;
        this.controller = controller;
    }
    
    @Override
    public void run() {
        try {
                socket = new DatagramSocket(port);
            } catch (SocketException ex) {
                Logger.getLogger(ServerUDP.class.getName()).log(Level.SEVERE, null, ex);
            }
        while(true){               
            buffer = new byte[1000000];
            packet = new DatagramPacket(buffer,buffer.length);
            System.out.println("Ascolto UDP!");
            try {                
                socket.receive(packet);
                System.out.println(packet);
                System.out.println("1");
            } catch (IOException ex) {
                Logger.getLogger(ServerUDP.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.out.println("Packet UDP Received!");
            try {
                ois = new ObjectInputStream(new ByteArrayInputStream(buffer));
            } catch (IOException ex) {
                Logger.getLogger(ServerUDP.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                p = (Packet) ois.readObject();
                System.out.println("Pacchetto/Evento arrivato con UDP!");
                System.out.println(p);
            } catch (IOException | ClassNotFoundException ex) {
                Logger.getLogger(ServerUDP.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(p.getOP() == 1){
                Thread t = new Thread(new FilesManager(socket,p,false, controller));
                t.start();
            }
            controller.enqueue(p);
            try {
                ois.close();
            } catch (IOException ex) {
                Logger.getLogger(ServerUDP.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
}
Sostanzialmente il server dovrebbe stampare System.out.println("1"); ogni volta che riceve un pacchetto. Per il primo funziona, quando mando un secondo pacchetto la stampa avviene due volte. Quindi è come se il server entri in socket.receive(packet) due volte invece che una.
L'eccezione viene lanciata da queste due righe:
codice:
ois = new ObjectInputStream(new ByteArrayInputStream(buffer));
codice:
p = (Packet) ois.readObject();
Spero possiate darmi qualche consiglio. Ringrazio in anticipo