/*	==============================================================================
	==	by S. Masetta   6/2/2005											======
	==	programma di esempio sull'uso delle applicazioni via rete			======
	==	in java. 
	==	Dopo la compilazione lanciare:
			java server 						per avviare il server
			java server	<indirizzo>				per avviare il client oppure
			java server	<nome sel pc server>

	==	Si scrive sulla console del client per vedere visualizzato nella	======
	==	finestra del server.
	==	Per finisce lanciare Ctrl + C
	==============================================================================*/
	
//-----------------------------------------------------------
// importo ilpackage con le classi per l'uso della rete
//-----------------------------------------------------------
import java.net.*;


class server 
	{
    public static int serverPort = 666;
    public static int clientPort = 999;
    public static int buffer_size = 1024;
    public static DatagramSocket ds;
    public static byte buffer[] = new byte[buffer_size];
	
	//---------------------------------------------------------------
	//--	questo è il client 
	//---------------------------------------------------------------
    public static void TheClient(String indirizzo_remoto) throws Exception 
		{
		int pos=0;
		System.out.println("	[ NOTA: disabilitare il firewall ]");
		
		String messaggio = " CONNESSO ! SONO IL PROF. S. MASETTA - Buongiorno !";
		
		buffer = messaggio.getBytes();
		ds.send(new DatagramPacket(buffer,messaggio.length(),InetAddress.getByName(indirizzo_remoto),serverPort));
		
		
        
        while (true) 
			{
            int c = System.in.read();
            switch (c) 
				{
                case -1: 
							messaggio = " --->> Client Disconnesso <<---";
							buffer = messaggio.getBytes();
							ds.send(new DatagramPacket(buffer,messaggio.length(),InetAddress.getByName(indirizzo_remoto),serverPort));
							System.out.println("-------->   FINE DEL COLLEGAMENTO <---------------");
			                return;
                case '\r': 
							System.out.println("\r");
							break;
                case '\n': 
							ds.send(new DatagramPacket(buffer,pos,InetAddress.getByName(indirizzo_remoto),serverPort));
       						pos=0;
	   						break;
                default: 
							buffer[pos++] = (byte) c;
				}
			}
		}
	
	
	//---------------------------------------------------------------
	//--	questo è il server 
	//---------------------------------------------------------------
	public static void TheServer() throws Exception 
		{
		while (true) 
			{
		   	DatagramPacket p = new DatagramPacket(buffer, buffer.length);
		    ds.receive(p);
			
			String ricevuto = new String(p.getData(),0,0,p.getLength());
			
			if (ricevuto.equals("fine"))
				{
				System.out.println("Fine della sessione di trasmissione !");
				return;
				}
			else
				{
				 System.out.println(ricevuto);
				}			
			}
		}



	public static void main(String args[]) throws Exception 
		{
        if (args.length == 1) 
			{
			//--------------------------------------------
			//-- in questo modo creo un socket che si	--
			//-- collega ad una porta specifica			--
			//--------------------------------------------
			String indirizzo_server = args[0].toString();
			//InetAddress indirizzo = getByName(String host) 
            ds = new DatagramSocket(clientPort);
			System.out.println("Client avviato sulla porta " + ds.getLocalAddress() );
			System.out.println("indirizzo server remoto: " + indirizzo_server);
            TheClient(indirizzo_server);
			
			} 
		else 
			{
			//--------------------------------------------
			//-- in questo modo creo un socket che si	--
			//-- collega ad una porta specifica			--
			//--------------------------------------------
            ds = new DatagramSocket(serverPort);
			System.out.println("Server avviato sulla porta "  + ds.getLocalAddress());
            TheServer();
			}
	}
}