PHP + JQuery + HTML + CSS, 1535 byte
Questa è una proposta che tende maggiormente a ciò che l'OP ha ritenuto "l'obiettivo effettivo". Cioè, un server di chat completamente funzionale, che può essere ospitato su qualsiasi server Web ovunque.
La funzionalità include:
- Notifiche quando gli utenti accedono o escono dalla chat room.
- Notifiche quando gli utenti cambiano il loro alias.
- Polling in tempo reale per nuovi messaggi, senza generare traffico del server in eccesso o carico del server.
- Layout e usabilità che ricordano fortemente i client di chat esistenti, come X-Chat.
Per essere una sessione, inserisci un alias nella casella appropriata e premi Tabo Enterper inviare. Se l'alias è già in uso, riceverai una notifica. Anche l'invio di messaggi avviene tramite Enter.

Per comodità, è possibile trovare un archivio di tutti i file qui: chat.zip (scegliere Scarica dal menu File). Per l'installazione, decomprimere in una directory Web su qualsiasi server che esegue PHP 5.4 o versioni successive.
Avvertenze:
- IE 8 o inferiore girerà in un ciclo infinito durante il polling, perché per qualche ragione sconosciuta all'umanità, tutte le richieste Ajax sono memorizzate nella cache per impostazione predefinita. Ti impedisce inoltre di inviare lo stesso messaggio due volte e di aggiornare correttamente l'elenco utenti. Questo potrebbe essere risolto aggiungendo
cache:false ad ogni richiesta Ajax.
- In tutte le versioni di IE, i messaggi non verranno inviati premendo Invio, poiché l'
changeevento non viene attivato (premendo Tab, tuttavia, funziona). Ciò potrebbe essere risolto aggiungendo un onkeypressgestore, controllando se la chiave era Invio e quindi chiamando $(v).blur().focus().
In breve, IE non è supportato.
Cliente
Il posizionamento degli elementi potrebbe essere un po 'più robusto, ma dovrebbe apparire a posto con una dimensione minima della finestra di circa 800x600.
chat.htm (190 byte)
<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 byte)
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 byte)
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})})
server
Mi scuso per il fatto che il server sia stato suddiviso in così tanti piccoli pezzi. L'alternativa sarebbe quella di utilizzare un protocollo di messaggio adeguato (tramite codifica / decodifica JSON) o avere un grandeif ... elseif ... secondo il quale sono presenti le variabili post. Realizzare script separati, solo una richiesta da quello di cui hai bisogno è molto più breve e forse più semplice di entrambi.
o.php (119 byte) O pen come connessione al 'database'
<?$m=array_slice(unserialize(file_get_contents(m)),-300);
$u=unserialize(file_get_contents(u));$t=time();extract($_GET);
c.php (57 byte) C ommits cambia in "database"
<?foreach([u,m]as$c)file_put_contents($c,serialize($$c));
p.php (151 byte) P olls per nuovi messaggi
<?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 byte) S termina un messaggio al server
<?include('o.php');$m[]=[$t,"<b>$n</b>: $v"];include('c.php');
u.php (222 bytes) U registrazione servizi o cambiamento 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 byte) Recupera l'elenco di utenti n ames
<?include('o.php');foreach($u as$k=>$v)echo"<option>$k</option>";
l.php (98 bytes) L'utente ha l EFT (chiuso browser)
<?include('o.php');$m[]=[$t,"<i><b>$l</b> has left the chat.</i>"];
unset($u[$l]);include('c.php');