PHP + JQuery + HTML + CSS, 1535 bytes
Esta es una presentación que se inclina más hacia lo que el OP consideró como 'el objetivo real'. Es decir, un servidor de chat totalmente funcional, que puede alojarse en casi cualquier servidor web en cualquier lugar.
La funcionalidad incluye:
- Notificaciones cuando los usuarios entran o salen de la sala de chat.
- Notificaciones cuando los usuarios cambian su alias.
- Sondeo en tiempo real para mensajes nuevos, sin generar tráfico excesivo del servidor o carga del servidor.
- Diseño y usabilidad muy parecidos a los clientes de chat existentes, como X-Chat.
Para ser una sesión, ingrese un alias en el cuadro correspondiente y presione Tabo Enterpara enviar. Si el alias ya está en uso, se le notificará. El envío de mensajes también se realiza a través de Enter.

Para su comodidad, puede encontrar un archivo de todos los archivos aquí: chat.zip (elija Descargar en el menú Archivo). Para instalar, descomprima en un directorio web en cualquier servidor que ejecute PHP 5.4 o superior.
Advertencias:
- IE 8 o inferior girará en un bucle infinito durante el sondeo, porque por alguna razón desconocida para la humanidad, todas las solicitudes de Ajax se almacenan en caché de forma predeterminada. También le impide enviar el mismo mensaje dos veces y actualizar la lista de usuarios correctamente. Esto podría solucionarse agregando
cache:falsea cada solicitud de Ajax.
- En todas las versiones de IE, los mensajes no se enviarán presionando Intro, porque el
changeevento no se activa (sin embargo, presionar Tabulador funciona). Esto podría solucionarse agregando un onkeypresscontrolador, verificando si la clave era Enter y luego llamando $(v).blur().focus().
En resumen, IE no es compatible.
Cliente
El posicionamiento de los elementos podría ser un poco más robusto, pero debería verse bien con un tamaño mínimo de ventana de aproximadamente ~ 800x600.
chat.htm (190 bytes)
<script src=jquery.min.js></script>
<script src=c.js></script>
<link rel=stylesheet href=c.css>
<select id=u multiple></select><pre id=o></pre>
<input id=n onchange=u()><input id=v onchange=s()>
c.css (136 bytes)
i{color:#999}
#u{float:right;height:100%;width:200px;margin-left:10px}
#o{border:1px solid #999;height:93%;overflow-y:scroll}
#v{width:54%}
c.js (435 bytes)
var l
(function p(){
$.ajax({url:'p.php',data:{n:$('#n').val()},success:function(d){
$('#o').html(d).scrollTop(1e4);$('#u').load('n.php');
},complete:p,timeout:2e4})
})()
function s(){
$.get('s.php',{n:$(n).val(),v:$(v).val()})
$(v).val('')
}
function u(){
$.get('u.php',{l:i=l,n:l=$(n).val()}).fail(function(){
alert("This name is already in use!")
$(n).val(l=i)
})
}
$(window).on('unload',function(){$.ajax({url:'l.php',data:{l:l},async:false})})
Servidor
Pido disculpas por el servidor dividido en tantos trozos pequeños. La alternativa sería utilizar un protocolo de mensaje adecuado (a través de codificación / decodificación JSON), o tener un if ... elseif ...mensaje grande de acuerdo con las variables de publicación presentes. Al hacer scripts por separado, un simple pedido del que necesita es mucho más corto y quizás más simple que ambos.
o.php (119 bytes) O pen como conexión a la 'base de datos'
<?$m=array_slice(unserialize(file_get_contents(m)),-300);
$u=unserialize(file_get_contents(u));$t=time();extract($_GET);
c.php (57 bytes) C omite cambios en la 'base de datos'
<?foreach([u,m]as$c)file_put_contents($c,serialize($$c));
p.php (151 bytes) P olls para mensajes nuevos
<?for($t=time();@filemtime(m)<$t;usleep(1e3))clearstatcache();include('o.php');
foreach($m as$v)if($n&&$v[0]>=$u[$n])echo@date("[H:i]",$v[0])."$v[1]\n";
s.php (62 bytes) S finaliza un mensaje al servidor
<?include('o.php');$m[]=[$t,"<b>$n</b>: $v"];include('c.php');
u.php (222 bytes) T inscripción Ser o cambio de alias
<?include('o.php');if(!trim($n)||$u[$n])exit(header('HTTP/1.1 418'));
$m[]=[$t,$u[$l]?
"<i><b>$l</b> is now known as <b>$n</b>.</i>":
"<i><b>$n</b> has entered the chat.</i>"];
$u[$n]=$u[$l]?:$t;unset($u[$l]);include('c.php');
n.php (65 bytes) recupera la lista de usuario n Ames
<?include('o.php');foreach($u as$k=>$v)echo"<option>$k</option>";
l.php (98 bytes) El usuario tiene l eft (cerró su navegador)
<?include('o.php');$m[]=[$t,"<i><b>$l</b> has left the chat.</i>"];
unset($u[$l]);include('c.php');