PHP的聊天功能。什么原理(不是聊天室)

mp3aaa 2009-12-23 05:50:31
我看过那些聊天室

就是那种一对一聊天的 而且看样子不是那种靠刷新做的

我感觉应该是ajax来做的 不过我前两天试着做了一下 失败了哎

谁有这方面的经验 说一下吧

...全文
705 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
brilliant_fgh 2010-01-06
  • 打赏
  • 举报
回复
用框架,隐式刷新!不然用户还在输入的内容就刷没了!
sindel 2009-12-30
  • 打赏
  • 举报
回复
哇靠,10L的好东西,研究一下
mp3aaa 2009-12-29
  • 打赏
  • 举报
回复
24楼给我个简单的例子吧 我看看 我刚下了个稍微复杂点的例子 关键是他用了prototype.js 我不了解。。

cooledit2730 2009-12-29
  • 打赏
  • 举报
回复
index.html 记得加载JQUERY.JS

<script src="jquery.js"></script>
<script type="text/javascript">
<!--
window.onload = function() {
getMsg(0);
}
function getMsg(time) {
$.post("back.php", {'timestamp': time ,"num":Math.random()}, function(data) {
var json = eval('('+ data +')');
document.getElementById("txt").innerHTML += json.msg+'<br>';
getMsg(json.timestamp);
});
}

function send() {
var v = document.getElementById('msg').value;
$('#msg').val('');
$.post("back.php", {'msg': v ,"num":Math.random()}, function(data) {

});
}
//-->
</script>
<div id="txt" ></div>
<input type="text" id="msg"><input type="button" value="Send" onclick="send()">

back.php
<?php

set_time_limit(0);
ob_end_clean();

$file = dirname(__FILE__). '/data.txt';

if(!empty($_REQUEST['msg'])){
file_put_contents($file, $_REQUEST['msg']);
die('Write');
}

$lastmodif = isset($_REQUEST['timestamp']) ? intval($_REQUEST['timestamp']) : 0;
$currentmodif = filemtime($file);

while($currentmodif <= $lastmodif ){
sleep(2);
clearstatcache();
$currentmodif = filemtime($file);
}

$response = array();
$response['msg'] = file_get_contents($file);
$response['timestamp'] = $currentmodif;
$response['lasttime'] = $lastmodif;
echo json_encode($response);
flush();
?>

另外新建data.txt文件
kukulu00 2009-12-28
  • 打赏
  • 举报
回复
客户端用flash socket 服务端 java socket or c# socket 这样是比较简单的
cooledit2730 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 foolbirdflyfirst 的回复:]
google->comet

(1)客户端ajax发送请求->(2)成功回调函数->(1)客户端ajax发送请求

基本上客户端是轮询的模型,不同的是,并不是由客户端不停发送请求,而是发送请求后,php server端检查没任何数据刷新的情况下要hold住请求(使用while循环),while循环里检测数据是否刷新,一旦发生数据刷新,就马上退出while循环,返回数据给客户端,客户端这时候才再次发送请求。
[/Quote]

如果还是不清楚的我这有个很简单的例子
n9sky 2009-12-28
  • 打赏
  • 举报
回复
一般还是用刷新方法的,B/S模式下的 server 端根本没有办法主动推送。

上面说的comet我第一次听说,感觉不错,但是对于一些虚拟主机限制IIS连接的就不适用了,而且每个人占用一个连接,长期不释放,不知道会不会占用系统资源
guopingchin 2009-12-28
  • 打赏
  • 举报
回复
看见代码就晕
mp3aaa 2009-12-28
  • 打赏
  • 举报
回复
这样吗?
是没有刷新网页 但是他重新发送了请求 和刷新没有区别

function fs(){
var ajax = cajax();

function ready(){
if(ajax.readyState==4){
var str=ajax.responseText;
if(str)
document.getElementById("xsh").value=str;
document.getElementById("shr").innerHTML="";
document.getElementById("xsh").scrollTop=document.getElementById("xsh").scrollTop+50;}
}
ajax.open("post","ajaxobj.php?text=laile",true);
var yunstr=document.getElementById("shr").innerHTML;
ajax.onreadystatechange=ready;
yunstr=yunstr.replace(/</g,"<");
yunstr=yunstr.replace(/>/g,">");
post="te="+yunstr;

ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
ajax.send(post);
document.getElementById("shr").innerHTML="";
}

function f5(){
var xhr2 = cajax();
function ready1(){
if( xhr2.readyState==4)
document.getElementById("xsh").value=xhr2.responseText;
document.getElementById("xsh").scrollTop=document.getElementById("xsh").scrollTop+500;
}
xhr2.open("post","ajaxobj.php?get2=f5",true);
xhr2.onreadystatechange=ready1;
xhr2.send(null);
}

function ms(){
if(document.getElementById("ck0").checked){
if( window.event.keyCode==13){
document.getElementById("13").click();
return false;
}}
else{
if(event.ctrlKey && window.event.keyCode==13){
document.getElementById("13").click();
return false;
}}

}
setInterval ("f5()",1000);
qazwsxhai 2009-12-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 mp3aaa 的回复:]
comet 我在看

不过AJAX 似乎不行 

除非刷新
[/Quote]
ajax 就行了.是你不懂ajax,它不用刷新.
jom_ch 2009-12-25
  • 打赏
  • 举报
回复
传说中的comet
quzhongxiong 2009-12-25
  • 打赏
  • 举报
回复
socket
luffyke 2009-12-24
  • 打赏
  • 举报
回复
ajax就行了
mp3aaa 2009-12-24
  • 打赏
  • 举报
回复
用ajax每间隔几毫秒读取一下数据就可以了///
这还是刷新啊。。。。
t240034137 2009-12-24
  • 打赏
  • 举报
回复
关注!
foolbirdflyfirst 2009-12-24
  • 打赏
  • 举报
回复
google->comet

(1)客户端ajax发送请求->(2)成功回调函数->(1)客户端ajax发送请求

基本上客户端是轮询的模型,不同的是,并不是由客户端不停发送请求,而是发送请求后,php server端检查没任何数据刷新的情况下要hold住请求(使用while循环),while循环里检测数据是否刷新,一旦发生数据刷新,就马上退出while循环,返回数据给客户端,客户端这时候才再次发送请求。
wbhggwk 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 mp3aaa 的回复:]
用ajax每间隔几毫秒读取一下数据就可以了///
这还是刷新啊。。。。
[/Quote]
这个可以,不过有点不合理,可以搜下 Server Plush 技术。
yybjroam05 2009-12-24
  • 打赏
  • 举报
回复
路过!!
yw1386 2009-12-24
  • 打赏
  • 举报
回复
你看看这个行不行,可以研究一下啊,在线客服网页聊天的,http://blog.csdn.net/yw1386/archive/2009/12/14/5006228.aspx
wxq4100798 2009-12-24
  • 打赏
  • 举报
回复
conet
加载更多回复(9)

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧