En la jerga usada en redes de datos, un servidor representa generalmente una aplicación de computadora que atiende a las peticiones realizadas por una o varias aplicaciones clientes. En esta práctica vamos a intentar que uno o varios clientes controlen de forma simultanea la frecuencia de la portadora que genera el servidor.
Para realizar la comunicación desde los clientes al servidor vamos a usar el TCP que es más fiable que el UCP y además permite conectarnos al servidor usando programas estándar como el telnet. Cuando se usa el TCP antes de transmitir nada es neceario realizar una conexión, luego transmitiremos y finalmente es necesario realizar una desconexión. El tiempo que puede transcurrir desde que se realiza la conexión hasta que se produce la desconexión es, a priori, indeterminado. Esto significa que si un cliente se conecta al servidor y éste no puede atender a otro cliente mientras el primero no ha cerrado su conexión, el segundo cliente tardará un tiempo indefinido en ser atendido. Para evitar este problema se utiliza un tipo de servidor que se conoce como concurrente. Un servidor concurrente permite que muchos clientes permanezcan conectados el tiempo que sea necesario, realizándose los ciclos de conexión-transmisión-desconexión de una forma totalmente asíncrona. La mayoría de los servidores de datos que existen y que usan el TCP (como los servidores Web) son servidores concurrentes. Para atender concurrentemente a cada cliente utilizaremos un thread para cada uno de ellos.
Para enviar la frecuencia desde el servidor a los clientes vamos a usar el UDP porque permite realizar transmisiones multicast. En una transmisión de este tipo una única fuente puede enviar un único paquete de datos a muchos destinos usando la infraestructura existente en la red de transmisión. Así, por muchos clientes que existan el servidor no se conviertirá en el cuello de botella del sistema.