ciao devo implementare con protoccolo UDP una specie di chat via shell
: (CLIENT E SHELL VENGONO MANDATI IN ESEC SU DUE SHELL DIVERSE)
- il client viene mandato in esec con i seguenti argomenti
java clientmsn portaserver portaclient
cosa fa il client?
-il client manda un pacchetto contenete un intero(la propria porta di ascolto) al server(lavoriamo su local host sia x server che client) che è in ascolta in portaserver.
- il server viene lanciato cosi
java servermsn portaserver
cosa fa il server?
aspetta un pacchetto con la porta in ascolto del client
dopo di che server e client iniziano a comunicare via shell come se fosse una vera e propria chat.
per la ricezione e invio ho pensato di creare 2 thread e farli partire entrambi sia sull host che sul server
nel codice del client e server troverete l uso di due classi assegnate dal prof
Input(utilizzo il metodo readline per leggere la stringa da linea di comando)
e
Obj2DP che fornisce due metodi statici:
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.
ora vi posto il codice del mio server e client
vi posto il codiceserver
codice:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class servermsn {
public static void main(String []args){
int porta_server=Integer.parseInt(args[0]);
try {
DatagramSocket server_ric=new DatagramSocket(porta_server);
DatagramSocket server_inv=new DatagramSocket();
byte[]buffer=new byte[512];
DatagramPacket dp = new DatagramPacket(buffer,buffer.length);
server_ric.receive(dp);
Object port=Obj2DP.dp2obj(dp);
int porta_client=(Integer) port;
System.out.println("inizio comunicazione");
while(true){
Thread_recapitasms t2=new Thread_recapitasms(server_ric);
Thread_inviasms t1=new Thread_inviasms(porta_client,server_inv);
t2.start();
t1.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();
}
}
}
e codice client
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 clientmsn {
public static void main(String []args){
int portaserver=Integer.parseInt(args[0]);
int portaclient=Integer.parseInt(args[1]);
try {
DatagramSocket client_ric=new DatagramSocket(portaclient);
DatagramSocket client_inv=new DatagramSocket();
InetAddress ia = InetAddress.getLocalHost();
DatagramPacket dp=Obj2DP.obj2dp(portaclient);
dp.setAddress(ia);
dp.setPort(portaserver);
client_inv.send(dp);
while(true){
Thread_inviasms t1=new Thread_inviasms(portaserver,client_inv);
Thread_recapitasms t2=new Thread_recapitasms(client_ric);
t1.start();
t2.start();
}
} 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();
}
}
}
ecco il codice dei thread utilizzati per invio e ricezione
X L INVIO:
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;
DatagramSocket ds;
public Thread_inviasms(int porta,DatagramSocket ds){
this.ds=ds;
this.porta=porta;
}
public void run(){
try {
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();
}
}
}
X LA RICEZIONE
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();
}
}
}
}
IL PROGRAMMA FUNZIONA CORRETTAMENTE PERO PRIMA DEI MESSAGGI DI CHAT SIA SULLA SHELL DEL CLIENT E SIA SULLA SHELL DEL SERVER CÈ IL SEGUENTE MESSAGGIO
Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:614)
at servermsn.main(servermsn.java:23)