ok, grazie sono arrivato a scrivere questo:
codice:
import java.io.*;
import java.net.*;
import java.applet.*;
public class UDPClient extends Applet{
	public static final String HOSTNAME = "localhost";
	public static final int PORT = 6769;
 
	public static void main(String[] args) {
		String host ="";
		int port = PORT;
		
		/**************************************RICEZIONE**************************************/
		
		try {
			// creo il socket
			DatagramSocket serverSocket = new DatagramSocket(PORT);
		   
			byte[] sendData = new byte[1024];
			byte[] receiveData = new byte[1024];
		   
			while (true){
				// istanzio il datagramma in input
				DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);
				
				// ricevo il datagramma dal socket
				serverSocket.receive(receivePacket);
				
				// recupero la frase
				String frase = new String(receivePacket.getData());
				
				// indirizzo ip
				InetAddress iPAddress = receivePacket.getAddress();
				
				// porta
				//int port = receivePacket.getPort();
				
				// modifico la porta
				String fraseModificata = frase.toUpperCase();
				
				// trasformo in byte 
				sendData = fraseModificata.getBytes();
				
				// creo un datagramma per inviare al client
				DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,iPAddress,port);

				//scrivo il datagramma sul socket
				serverSocket.send(sendPacket); 
			} 
		}catch(SocketException e){
			System.out.println("Problemi nell'apertura del socket "+e.getMessage());
		}catch(IOException e){
			System.out.println("Problemi di I/O : "+e.getMessage());
		}
		
		/**************************************INVIO**************************************/
	  
		if (args.length==0){
			System.out.println("Parametri di default.");
			System.out.println("Host : "+HOSTNAME);
			host = HOSTNAME;
		}else{
			if (args.length==1){
				host = args[0];
			}
			if (args.length==2){
				host = args[0];
				port = new Integer(args[1]).intValue();
			}
		}
	  
		// buffer di input del client
		BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
		
		try{
			// creo il socket client
			DatagramSocket clientSocket = new DatagramSocket();
	  
			// creo l'indirizzo ip
			InetAddress IPAddress = InetAddress.getByName(host);
	   
			byte[] sendData = new byte[1024];
			byte[] receiveData = new byte[1024];
	   
			String frase = inFromUser.readLine();
	   
			sendData = frase.getBytes();
	   
			// creo un datagramma con i dati da inviare, lunghezza, ip e porta
			DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,IPAddress,port);
			
			// invio il datagramma al server
			clientSocket.send(sendPacket);
	   
			// credo un pacchetto 
			DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);
	   
			clientSocket.receive(receivePacket);
	   
			// frase ricevuta dal server
			String fraseModificata = new String(receivePacket.getData());
	   
			System.out.println("Frase ricevuta : "+fraseModificata);
	   
			// chiudo il socket
			clientSocket.close();
		}catch(SocketException e){
			System.out.println("Problemi con il socket : "+e.getMessage());
		}catch(UnknownHostException e){
			System.out.println("Host sconosciuto : "+e.getMessage());
		}catch (IOException e){
			System.out.println("I/O exception : "+e.getMessage());
		}
	}
}
ma non va, mi dice:
Problemi nell'apertura del socket Address already in use: Cannot bind

ho unito la ricezione e l'invio nella stessa classe perchè mi serve che l'applet invii e riceva i messaggi. ho anche commentato:
int port = receivePacket.getPort();
perchè unendo i codici non serve che la ricezione setti la porta siccome è già stata definita all'inizio.

Provo anche ad ottimizzare un pò il codice perxhè c'è un pò di ridondanza