TESTO PROBLEMA:
S i realizzino un Server e un Client UDP che realizzano un semplice
Instant Messanger: ogni linea scritta nella shell del Server viene copiata
nella shell del Client e viceversa. La trasmissione delle linee inizia dopo
una semplice fase di handshaking, descritta di seguito.
Il Server viene lanciato da shell, fornendo il numero di porta su
cui ricevere i pacchetti UDP.
Il Client viene lanciato da un'altra shell (eventualmente su un
altro computer), fornendo host e porta del Server e porta locale
su cui ricevere pacchetti UDP.
Il Client manda una richiesta di connessione al Server, indicando
nel messaggio la propria porta. Se non riceve un messaggio di ack
entro 3 secondi, riprova a mandare la richiesta altre 5 volte, poi
termina. Se invece riceve l'ack, inizia la trasmissione delle linee
scritte nella shell locale e la ricezione e stampa delle linee scritte
nella shell del Server.
----------------------------------------------------------------------------------------------------------------
CLASSE SERVER MSN:
codice:import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class Servermsn { public static void main(String []args){ int porta=Integer.parseInt(args[0]);// porta in cui il server è in attesa try { DatagramSocket ds=new DatagramSocket(porta); DatagramPacket dp = new DatagramPacket(new byte[512],512); ds.receive(dp); // ricevo pacchetto che contiene la porta del client in ricezione Object res=Obj2DP.dp2obj(dp); int portaclient=(Integer) res; DatagramPacket ack = new DatagramPacket(new byte[512],512); ack.setAddress(InetAddress.getLocalHost()); ack.setPort(portaclient); ds.send(ack); while(true){ Thread_recapitasms t1=new Thread_recapitasms(ds); Thread_inviasms t2= new Thread_inviasms(portaclient); t1.start(); t2.start(); } } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
CLASSE CLIENT:
uso una classe Input per leggere da linea di comando che è funzionante xche consegnata dal profcodice:import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; public class clientmsn { public static void main(String[]args){ int portaserver=Integer.parseInt(args[0]); int i=0; boolean b=false; try { DatagramSocket ds = new DatagramSocket(Integer.parseInt(args[1])); InetAddress ia = InetAddress.getLocalHost(); DatagramPacket dp=Obj2DP.obj2dp(Integer.parseInt(args[1])); dp.setAddress(ia); dp.setPort(portaserver); ds.send(dp);//invio la porta in ascolto del client al server //faccio 5 tentativi di connessione b=true quando mi arriva l ack do{ try{ byte [ ] buffer = new byte [200]; DatagramPacket ack = new DatagramPacket(buffer, buffer.length); ds.setSoTimeout(3000); ds.receive(ack); b=true; ds.setSoTimeout(0); } catch (SocketTimeoutException e){ i++; System.out.println(i+"tentativo di connessione a vuoto"); } }while((i<=5)&&(b==false)); if(b==true){ Thread_inviasms t1=new Thread_inviasms(porta); Thread_recapitasms t2=new Thread_recapitasms(ds); t1.start(); t2.start(); }else System.out.println("tutti i tentativi andati a vuoto"); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
uso una classe Obj2DP che fornisce due metodi statici(anch essa fornita dal prof:
-public static Object dp2obj(DatagramPacket dp)
che restituisce l'oggetto contenuto nel pacchetto passato per
argomento, deserializzandolo
- public static DatagramPacket obj2dp(Object obj)
che restituisce un pacchetto contenente l'oggetto passato per
argomento, serializzato, nel payload.
infine il server e il client fanno uso di due thread che mi servono uno per l invio e uno per la ricezione
x la ricezione:
x invio mex:codice:import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class Thread_recapitasms extends Thread { DatagramSocket ds; public Thread_recapitasms(DatagramSocket ds){ this.ds=ds; } public void run(){ DatagramPacket dp = new DatagramPacket(new byte[512],512); while(true){ try { ds.receive(dp); Object res=Obj2DP.dp2obj(dp); String sms=(String) res; System.out.println(sms); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } // receive packet catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
codice:import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class Thread_inviasms extends Thread { int porta; public Thread_inviasms(int porta){ this.porta=porta; } public void run(){ try { DatagramSocket ds = new DatagramSocket(); InetAddress ia = InetAddress.getLocalHost(); while(true){ String mex=Input.readLine(); DatagramPacket dp=Obj2DP.obj2dp(mex); dp.setAddress(ia); dp.setPort(this.porta); ds.send(dp); } } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
lancio prima il programma servermsn con argomento la proprio porta in ascolto
ex: javac servermsn 24309
lancio il client cona rgomento porta server e propria porta in ascolto
ex:javac clientmsn 24309 24310
che succede?
finche non scrivo qualcosa nella chat del client ho uno spam di errori sulla shell del server
poi quando scrivo esempio ciao
nella shell dl server arriva la parola ciao e i due iniziano a parlare correttamente
da dove provengano quei messaggi di errore?

