Pues para empezar, puedes indicar el lenguaje...
En cuanto al planteamiento, no lo acabo de ver bien. Lo que se suele hacer es que en el lado del servidor tienes un dispatcher (despachador, o algo así) y el propio "programa" servidor. El dispatcher es el que va a estar escuchando peticiones de los clientes, y les va a conectar con el servicio en sí. El servicio típicamente estará implementado por hilos.
Básicamente lo que se hace en el servidor es que el dispatcher escucha una petición, crea el hilo servidor correspondiente, lo "conecta" con el cliente y vuelve a quedar a la espera de peticiones. Es el hilo servidor el que proporciona el servicio al cliente.
De esta forma puedes dar servicio a varios clientes al mismo tiempo sin necesidad de ningún tipo de sincronización (al menos en principio, porque dependerá del servicio en sí)
La otra opción más sencilla de implementar, aunque menos eficiente, es que sea el propio dispatcher el que proporcione el servicio. El problema es que sólo vas a atender a un cliente a la vez, aunque no necesitas trabajar con hilos. Puede ser útil si el tiempo que se tarda en proporcionar el servicio es ínfimo (proporcionar la hora, el nombre del programa que se está ejecutándo, etc)