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)