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

时间:2022-03-16 12:45:14
我看过那些聊天室   

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

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

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

29 个解决方案

#1


服务推, 或flex

#2


我以前问过同样的问题

http://hi.csdn.net/link.php?url=http://topic.csdn.net%2Fu%2F20090819%2F01%2F924a04fd-6932-4057-9698-6c9e27ab6749.html

#3


就是AJAX就行了

#4


是啊 用ajax每间隔几毫秒读取一下数据就可以了

#5


learn

#6


用ajax每间隔几毫秒读取一下数据就可以了///
这还是刷新啊。。。。

#7


学习了。

#8


路过,
不懂ajax ,初学php,

#9


conet

#10


你看看这个行不行,可以研究一下啊,在线客服网页聊天的, http://blog.csdn.net/yw1386/archive/2009/12/14/5006228.aspx

#11


路过!!

#12


引用 6 楼 mp3aaa 的回复:
用ajax每间隔几毫秒读取一下数据就可以了///
 这还是刷新啊。。。。

这个可以,不过有点不合理,可以搜下 Server Plush 技术。

#13


google->comet

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

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

#14


关注!

#15


ajax就行了

#16


comet 我在看 

不过AJAX 似乎不行  

除非刷新 

#17


引用 16 楼 mp3aaa 的回复:
comet 我在看

 不过AJAX 似乎不行

 除非刷新


ajax可以借用框架, 要不你真是晕了

#18


socket

#19


传说中的comet

#20


引用 16 楼 mp3aaa 的回复:
comet 我在看

不过AJAX 似乎不行 

除非刷新

ajax 就行了.是你不懂ajax,它不用刷新.

#21


这样吗?
是没有刷新网页 但是他重新发送了请求 和刷新没有区别

  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(/&lt;/g,"<");
  yunstr=yunstr.replace(/&gt;/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);

#22


看见代码就晕

#23


一般还是用刷新方法的,B/S模式下的 server 端根本没有办法主动推送。

上面说的comet我第一次听说,感觉不错,但是对于一些虚拟主机限制IIS连接的就不适用了,而且每个人占用一个连接,长期不释放,不知道会不会占用系统资源

#24


引用 13 楼 foolbirdflyfirst 的回复:
google->comet

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

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


如果还是不清楚的我这有个很简单的例子 

#25


客户端用flash socket 服务端 java socket or c# socket 这样是比较简单的

#26


24楼给我个简单的例子吧 我看看 我刚下了个稍微复杂点的例子  关键是他用了prototype.js  我不了解。。

#27


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文件 

#28


哇靠,10L的好东西,研究一下

#29


用框架,隐式刷新!不然用户还在输入的内容就刷没了!

#1


服务推, 或flex

#2


我以前问过同样的问题

http://hi.csdn.net/link.php?url=http://topic.csdn.net%2Fu%2F20090819%2F01%2F924a04fd-6932-4057-9698-6c9e27ab6749.html

#3


就是AJAX就行了

#4


是啊 用ajax每间隔几毫秒读取一下数据就可以了

#5


learn

#6


用ajax每间隔几毫秒读取一下数据就可以了///
这还是刷新啊。。。。

#7


学习了。

#8


路过,
不懂ajax ,初学php,

#9


conet

#10


你看看这个行不行,可以研究一下啊,在线客服网页聊天的, http://blog.csdn.net/yw1386/archive/2009/12/14/5006228.aspx

#11


路过!!

#12


引用 6 楼 mp3aaa 的回复:
用ajax每间隔几毫秒读取一下数据就可以了///
 这还是刷新啊。。。。

这个可以,不过有点不合理,可以搜下 Server Plush 技术。

#13


google->comet

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

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

#14


关注!

#15


ajax就行了

#16


comet 我在看 

不过AJAX 似乎不行  

除非刷新 

#17


引用 16 楼 mp3aaa 的回复:
comet 我在看

 不过AJAX 似乎不行

 除非刷新


ajax可以借用框架, 要不你真是晕了

#18


socket

#19


传说中的comet

#20


引用 16 楼 mp3aaa 的回复:
comet 我在看

不过AJAX 似乎不行 

除非刷新

ajax 就行了.是你不懂ajax,它不用刷新.

#21


这样吗?
是没有刷新网页 但是他重新发送了请求 和刷新没有区别

  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(/&lt;/g,"<");
  yunstr=yunstr.replace(/&gt;/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);

#22


看见代码就晕

#23


一般还是用刷新方法的,B/S模式下的 server 端根本没有办法主动推送。

上面说的comet我第一次听说,感觉不错,但是对于一些虚拟主机限制IIS连接的就不适用了,而且每个人占用一个连接,长期不释放,不知道会不会占用系统资源

#24


引用 13 楼 foolbirdflyfirst 的回复:
google->comet

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

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


如果还是不清楚的我这有个很简单的例子 

#25


客户端用flash socket 服务端 java socket or c# socket 这样是比较简单的

#26


24楼给我个简单的例子吧 我看看 我刚下了个稍微复杂点的例子  关键是他用了prototype.js  我不了解。。

#27


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文件 

#28


哇靠,10L的好东西,研究一下

#29


用框架,隐式刷新!不然用户还在输入的内容就刷没了!