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:
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 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(); } } } }
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![]()

Rispondi quotando