Salve a tutti , sto facendo un banalissimo test per scambio di messaggi tra un Server UDP e n Client UDP e il test ha funzionato benissimo. Nel momento in cui però voglio rendere il tutto Multithread ... non so come mai ma non funziona , o meglio l'esecuzione va, ma ricevo un mare di errori a run time.

ClientUDP :
codice:
package client;

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


public class ClientUDP {


    public static void main(String[] args) {
        try {
            
            //Invio Messaggio Al server
            DatagramSocket s = new DatagramSocket();
            System.out.println("[CLIENT] Invio messaggio al server");
            String msg  = new String("Ciao Server");
            DatagramPacket request = new DatagramPacket(msg.getBytes(),msg.getBytes().length,InetAddress.getLocalHost(),8000);
            Thread.sleep(5000);
            s.send(request);
            
            //Ricezione Risposta Server
            byte data[] = new byte[65508];
            DatagramPacket answer = new DatagramPacket(data,data.length);
            System.out.println("[CLIENT] in attesa di risposta dal server");
            s.receive(answer);
            String ans = new String(answer.getData(),0,answer.getLength());
            System.out.println("[CLIENT] risposta dal server ricevuta= "+ans);
            
            //chiusura socket
            s.close();
        }
        catch(IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

ServerUDP:
codice:
package server;

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


public class ServerUDP {
    public static void main(String[] args) {
        while(true) {
            try {
                DatagramSocket socket = new DatagramSocket(8000);
                byte data[] = new byte[65508];
                DatagramPacket listening = new DatagramPacket(data, data.length);
                System.out.println("[Server] In attesa di pacchetto UDP...");
                socket.receive(listening);
                System.out.println("[Server] Istanzio un WorkerServerUDP");
                WorkerServerUDP w = new WorkerServerUDP(listening);
                w.start();
            } catch (IOException e) {
                e.printStackTrace();
            }


        }
    }


}
WorkerServerUDP (il thread che dovrebbe eseguire le interazioni con il client ... il server dovrebbe solo fare listening e lasciare le varie interazioni ai threads) :
codice:
package server;

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


public class WorkerServerUDP extends Thread{
    
    private DatagramPacket p;


    
    public WorkerServerUDP(DatagramPacket pkt) {
        p = pkt;
    }
    
    public void run() {
        try {
        //Istanzio una DatagramSocket per send/recieve
        DatagramSocket s = new DatagramSocket();
        
        //Lettura messaggio client 
        byte[] receivedData = p.getData();
        String msg = new String(receivedData,0,p.getLength());
        System.out.println("[Worker] Messaggio ricevuto dal client= "+msg);
        
        //Invio ack al client 
        String response = new String("ack");
        DatagramPacket risp = new DatagramPacket(response.getBytes(),response.getBytes().length,p.getAddress(),p.getPort());
        System.out.println("[Worker] Invio Risposta");
        s.send(risp);
        System.out.println("[Worker] Risposta inviata");
        
        //chiusura socket
        s.close();
        } 
        catch (IOException e) {
            
            e.printStackTrace();
        }
    }
}

Quello che succede avviando da cmd è :
http://i64.tinypic.com/2egcwfl.png


Se vedete la prima schermata a sinistra (il server) sebbene gli innumerevoli errori , procede fino alla fine e di fatti , nella schermata a destra , il client riceve anche l'ack mandatagli dal thread.

Quindi l'esecuzione funziona ( di fatti ho fatto un copia incolla del codice che prima era tutto in ServerUDP.java nella run di WorkerServerUDP.java ) solo che quando il codice della run era in ServerUDP.java tutto funzionava senza errori , ora che è in WorkerServerUDP.java funziona ma dà una caterva di errori... Sapete spiegarmi perché e come risolvere ? Grazie In Anticipo