/************************************************************************************************
* Create a UDP/IP server
* UDP communication uses UDP packets and a UDP socket to communicate.
* a UDP packet needs to contain the IP address & port of the remote machine, as well as the data  
* a UDP socket needs to be created to perform the communication.
* as a server, when a UDP socket is created you assign it (bind it) to a fixed port number.
*
* Usage: UDPclient <serverPort>
* 
* @version 1.0
* @author Sam Sultan
*************************************************************************************************/
import java.io.*;
import java.net.*;

public class UDPserver
{
    public static void main(String[] args)
    {
        if (args.length != 1) {
            System.out.println("Usage: UDPclient <serverPort>");
            System.exit(0);
        }
    
        String recvString;                  //string to convert receive array
        String sendString;                  //string to convert send array

        byte[] recvArray = new byte[256];   //array to receive data from client
        byte[] sendArray = new byte[256];   //array to send data to client 

		int recvLength;
		
        InetAddress serverIP;               //IP address object for server
        InetAddress clientIP;               //IP address object for client
    
        int serverPort;                     //port number for server
        int clientPort;                     //port number for client

        DatagramPacket recvPacket;          //UDP packet object to receive
        DatagramPacket sendPacket;          //UDP packet object to send

        DatagramSocket UDPsocket;           //UDP socket object

        try
        {
            serverIP   = InetAddress.getLocalHost();        //get local server address
            serverPort = Integer.parseInt(args[0]);         //get server port number        

            System.out.println("Server Host Name.....: " + serverIP.getHostName());
            System.out.println("Server IP Address....: " + serverIP.getHostAddress());
            System.out.println("Server Port Requested: " + serverPort);

            //create 2 IP packets - empty packet
            recvPacket = new DatagramPacket(recvArray, recvArray.length);
            sendPacket = new DatagramPacket(sendArray, sendArray.length);

            UDPsocket  = new DatagramSocket(serverPort);     //establish UDP socket at port #

            System.out.println("Server Port Bound to.: " + UDPsocket.getLocalPort());
            System.out.println();

            while(true)
            {
                /*------------------ receiving data ------------------------------------*/

                System.out.println("Waiting for client...... ");
                System.out.println();

                UDPsocket.receive(recvPacket);              //receive UDP packet

                clientIP   = recvPacket.getAddress();       //get client IP address
                clientPort = recvPacket.getPort();          //get client Port number    
                recvArray  = recvPacket.getData();          //extract data from packet
				recvLength = recvPacket.getLength();		//number of bytes received

                recvString = new String(recvArray,0,recvLength);  //convert to string;
                recvString = recvString.trim();             	  //trim white space

                System.out.println("Received........: " + recvString ); 
                System.out.println("from client name: " + clientIP.getHostName());
                System.out.println("at IP address...: " + clientIP.getHostAddress());
                System.out.println("at port number..: " + clientPort);
                System.out.println();

                /*------------------ sending data ----------------------------------------*/
    
                sendString = recvString.toUpperCase();      //convert to upper case

                sendArray = sendString.getBytes();          //convert string to byte array

                sendPacket.setData(sendArray);				//write new data
                sendPacket.setAddress(clientIP);			//write client IP in send packet 
                sendPacket.setPort(clientPort);				//write client Port in send packet

                System.out.println("Sending.........: " + "\'" + sendString + "\'"); 
                System.out.println("to client name..: " + clientIP.getHostName());
                System.out.println("at IP address...: " + clientIP.getHostAddress());
                System.out.println("at port number..: " + clientPort);
                System.out.println();

                UDPsocket.send(sendPacket);         //send IP packet        
            }
        }

        catch(IOException e)
        {
            System.out.println("I/O error: " + e.toString());
            System.exit(-1);
        }
    }
}