PHP + JQuery + HTML + CSS, 1535 byte
Đây là một đệ trình nghiêng nhiều hơn về những gì OP coi là "mục tiêu thực tế". Đó là, một máy chủ trò chuyện đầy đủ chức năng, có thể được lưu trữ trên bất kỳ máy chủ web nào ở bất cứ đâu.
Chức năng bao gồm:
- Thông báo khi người dùng vào hoặc ra khỏi phòng chat.
- Thông báo khi người dùng thay đổi bí danh của họ.
- Thăm dò thời gian thực cho các tin nhắn mới, mà không tạo ra lưu lượng máy chủ dư thừa hoặc tải máy chủ.
- Bố cục và khả năng sử dụng rất giống với các ứng dụng trò chuyện hiện có, chẳng hạn như X-Chat.
Để trở thành một phiên, hãy nhập bí danh vào ô thích hợp và nhấn Tabhoặc Enterđể gửi. Nếu bí danh đã được sử dụng, bạn sẽ được thông báo. Gửi tin nhắn cũng được thực hiện thông qua Enter.

Để thuận tiện cho bạn, có thể tìm thấy kho lưu trữ của tất cả các tệp tại đây: chat.zip (chọn Tải xuống từ menu Tệp). Để cài đặt, giải nén vào thư mục web trên bất kỳ máy chủ nào chạy PHP 5.4 trở lên.
Hãy cẩn thận:
- IE 8 hoặc thấp hơn sẽ quay thành một vòng lặp vô hạn trong khi bỏ phiếu, vì một số lý do mà nhân loại không biết, tất cả các yêu cầu Ajax được lưu trữ theo mặc định. Nó cũng ngăn bạn gửi cùng một tin nhắn hai lần và cập nhật danh sách người dùng đúng cách. Điều này có thể được khắc phục bằng cách thêm
cache:falsevào mọi yêu cầu Ajax.
- Trong tất cả các phiên bản IE, tin nhắn sẽ không được gửi bằng cách nhấn Enter, vì
changesự kiện không được kích hoạt (tuy nhiên, nhấn Tab, không hoạt động). Điều này có thể được khắc phục bằng cách thêm một onkeypresstrình xử lý, kiểm tra xem khóa có phải là Enter không, và sau đó gọi $(v).blur().focus().
Nói tóm lại, IE không được hỗ trợ.
Khách hàng
Định vị các yếu tố có thể mạnh hơn một chút, nhưng nó sẽ trông ổn với kích thước cửa sổ tối thiểu khoảng ~ 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})})
Người phục vụ
Tôi xin lỗi vì máy chủ bị chia thành nhiều khối nhỏ. Cách khác là sử dụng một giao thức thông báo đầy đủ (thông qua mã hóa / giải mã JSON) hoặc có một giao thức lớn if ... elseif ...theo đó có các biến bài đăng nào. Tạo các tập lệnh riêng biệt, một yêu cầu chỉ từ một tập lệnh bạn cần ngắn hơn rất nhiều và có lẽ đơn giản hơn cả hai.
o.php (119 byte) O bút làm kết nối đến 'cơ sở dữ liệu'
<?$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 thay đổi thành 'cơ sở dữ liệu'
<?foreach([u,m]as$c)file_put_contents($c,serialize($$c));
p.php (151 byte) P olls cho tin nhắn mới
<?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 kết thúc một tin nhắn đến máy chủ
<?include('o.php');$m[]=[$t,"<b>$n</b>: $v"];include('c.php');
u.php (222 byte) Đăng ký U ser hoặc thay đổi bí danh
<?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) Lấy danh sách người dùng n ames
<?include('o.php');foreach($u as$k=>$v)echo"<option>$k</option>";
l.php (98 byte) Người dùng có l eft (đóng trình duyệt của họ)
<?include('o.php');$m[]=[$t,"<i><b>$l</b> has left the chat.</i>"];
unset($u[$l]);include('c.php');