PHP + JQuery + HTML + CSS,1535字节
这是一份更倾向于OP认为是“实际目标”的意见书。也就是说,功能齐全的聊天服务器,可以托管在几乎任何地方的任何Web服务器上。
功能包括:
- 用户进入或离开聊天室时的通知。
- 用户更改别名时的通知。
- 实时轮询新消息,而不会产生过多的服务器流量或服务器负载。
- 布局和可用性非常类似于现有的聊天客户端,例如X-Chat。
要成为会话,请在相应的框中输入别名,然后按Tab或Enter提交。如果别名已被使用,则会通知您。也可以通过发送消息Enter。

为了方便起见,可以在这里找到所有文件的存档:chat.zip(从“文件”菜单中选择“下载”)。要安装,请解压缩到任何运行PHP 5.4或更高版本的服务器上的Web目录。
注意事项:
- 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 ...
根据存在的post变量使用较大的消息协议。制作单独的脚本,只是从您需要的脚本中请求一个脚本,比两个脚本都短得多,甚至可能更简单。
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 olls新消息
<?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个字节)用户具有升 EFT(关闭他们的浏览器)
<?include('o.php');$m[]=[$t,"<i><b>$l</b> has left the chat.</i>"];
unset($u[$l]);include('c.php');