PHP + JQuery + HTML + CSS, 1535 байт
Це подання, що більше схиляється до того, що ОП вважає "фактичною метою". Тобто, повністю функціональний сервер чату, який може розміщуватися майже на будь-якому веб-сервері де завгодно.
Функціональність включає:
- Повідомлення, коли користувачі входять або виходять із кімнати чату.
- Сповіщення, коли користувачі змінюють псевдонім.
- Опитування в реальному часі для нових повідомлень, не генеруючи зайвий трафік сервера або завантаження сервера.
- Макет і зручність використання дуже нагадують існуючих клієнтів чату, таких як X-Chat.
Для того, щоб бути сеансом, введіть псевдонім у відповідне поле та натисніть Tabабо Enterдля подання. Якщо псевдонім вже використовується, вам буде повідомлено. Надсилання повідомлень також здійснюється через Enter.

Для вашої зручності тут можна знайти архів усіх файлів: chat.zip (виберіть Завантажити в меню Файл). Щоб встановити, розпакуйте його до веб-каталогу на будь-якому сервері, на якому працює PHP 5.4 або вище.
Застереження:
- IE 8 або нижче буде перетворюватися на нескінченний цикл під час опитування, оскільки з незрозумілої людству причини, всі запити Ajax кешовані за замовчуванням. Це також заважає вам надсилати одне і те ж повідомлення двічі та належним чином оновлювати список користувачів. Це можна виправити, додавши
cache:false до кожного запиту Ajax.
- У всій версії IE повідомлення не надсилатимуться натисканням клавіші Enter, оскільки
changeподія не спрацьовує (натискання Tab, однак, працює). Це можна виправити, додавши onkeypressобробник, перевіривши, чи був ключ Enter, а потім зателефонувавши $(v).blur().focus().
Словом, IE не підтримується.
Клієнт
Розташування елементів може бути дещо надійнішим, але воно повинно виглядати нормально з мінімальним розміром вікна приблизно ~ 800x600.
chat.htm (190 байт)
<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 байт)
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 байт)
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})})
Сервер
Прошу вибачення за те, що сервер розпався на стільки маленьких шматочків. Альтернативою було б використовувати адекватний протокол повідомлення (через кодування / декодування JSON) або мати великийif ... elseif ... відповідно до якого змінні повідомлення розміщуються. Створюючи окремі сценарії, справедливий запит від потрібного вам набагато коротше і, можливо, простіше, ніж обидва.
o.php (119 байт) O ручки як з'єднання з "базою даних"
<?$m=array_slice(unserialize(file_get_contents(m)),-300);
$u=unserialize(file_get_contents(u));$t=time();extract($_GET);
c.php (57 байт) C опускає зміни до "бази даних"
<?foreach([u,m]as$c)file_put_contents($c,serialize($$c));
p.php (151 байт) P ОЛЛС для нових повідомлень
<?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 байти) S закінчують повідомлення серверу
<?include('o.php');$m[]=[$t,"<b>$n</b>: $v"];include('c.php');
u.php (222 байти) реєстрація U ser або зміна псевдоніма
<?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 байт) Отримує список користувачів n ames
<?include('o.php');foreach($u as$k=>$v)echo"<option>$k</option>";
l.php (98 байт) Користувач має l eft (закрив свій браузер)
<?include('o.php');$m[]=[$t,"<i><b>$l</b> has left the chat.</i>"];
unset($u[$l]);include('c.php');