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