Amigo, cada vez que haces click en un hipervínculo (tag <a>) el navegador (cliente) le está preguntando algo al servidor ("¿tienes este archivo?, si lo tienes, mándamelo"). Y el servidor le contesta exactamente a él
.
No hay ningún misterio en eso.
Lo que pasa es que en un chat esto sucede automáticamente en el sentido de que el usuario no tiene que hacer nada para que los mensajes aparezcan, este es el punto que debes simular.
Del lado del cliente me parece que es más sencillo pues, si yo tuviera que hacerlo, pondría un temprizador en JavaScript que cada X segundos envíe una petición al servidor (levantando un .php, obviamente) e imprimo el resultado de forma conveniente.
Del lado del servidor se me ocurre que el mecanismo de relay sería así:
Cada vez que un cliente envía un mensaje, lo escribo en un archivo (una tabla SQL tal vez?), miro quiénes están conectados al "canal" (previamente los clientes pasaron por un mecanismo de "login") y registro que esos usuarios aún no han recibido ese mensaje y espero.
Cuando un cliente pregunte ¿hay mensajes nuevos? (el cliente hace esto usando el temporizador previamente comentado) le envío todos los mensajes marcados como no enviados a ese cliente en particular y verifico si queda algún cliente del "canal" al cual no le haya enviado el mensaje, si no queda ninguno, elimino el mensaje.
Creo que ese sería el mecanismo fundamental.
Hay otros detalles por supuesto, pero como guía/ayudamemoria/vuelapluma/sketch o como quieras llamarle, basta.