网页聊天的原理是什么? PHP做服务器

pgmsoul 2013-03-28 10:05:40
我看56秀那个聊天就是即时的, 而且就是网页, 没用flash.

突然发这个贴的时候想到一个方法, 后台不断的ajax获取数据就行了, 因为服务器可以写个专门的页面, 只处理新的数据, 数据量不大, 客户端用JavaScript显示上去. 刷新率可以做的很快, 比如几秒. 不知道这个方案是否可行.

不过56那个网页聊天看上去就是即时的, 不知道它是用的哪个技术.
...全文
187 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pgmsoul 2013-03-29
  • 打赏
  • 举报
回复
有一个思路, PHP也是能输出流的, 把文本作为流输出, 客户端用ajax获取这些数据流, 然后再转成文本输出, 就可以做到实时. 不过实际上服务端还是要有个刷新过程, 看是否有新数据要输出. 不过比ajax刷新要效率高得多, 省去头数据了. 因为每次刷新, 数据可能就几条或者大多为空.
pgmsoul 2013-03-29
  • 打赏
  • 举报
回复
这是我写的代码, 测试可行, 浏览器是chrome.

ajax = function(method, url, data) {
	var objxml = jsuse.createXMLHttpRequest(); //自己写这个函数, 我使用了一个库.
	if (url.indexOf("http://") != 0) {
		url = jsuse.BASE_URL + url;
	}
	objxml.open(method, url, true); //异步调用
	objxml.setRequestHeader("Content-type", "application/x-octet-stream");
	var pos = 0;
	objxml.onreadystatechange = function() {
		if (objxml.readyState == 4) {
			if (objxml.status == "200") {
				document.write("200 OK");
			} else {
				//document.write(objxml.status);
			}
		} else if(objxml.readyState == 3) {
			var str = objxml.responseText;
			document.write(str.substr(pos));
			pos = str.length;
		} else {
			document.write(objxml.readyState+"<br />");
		}
	}
	try {
		objxml.send(data);
	} catch (e) {
		return false;
	}
	return true;
}
jsuse(function(){
	ajax("post","test.php",""); //这一句会在onLoad里加载, 可以写在body的onLoad里.
});
PHP页面

	set_time_limit(0); //设置页面永不超时
	for($i=0;$i<3000;$i++){ //先把浏览器缓冲清掉, 不同浏览器这个值不同.
		echo " ";
	}
	ob_implicit_flush(true); //设置PHP实时输出
	$n = 0;
	while(true) {
	  echo "$n yeah :-))))<br />";
	  @ob_flush();//刷新缓冲.
	  sleep(1);
	  $n++;
	}
测试可以连续实时的输出. 上面代码有个问题, ajax取的数据会持续增大, 应该达到一个值, 重新连接一次. 服务器端也要有具体控制数据的方法.
pgmsoul 2013-03-28
  • 打赏
  • 举报
回复
引用 1 楼 zzgzzg00 的回复:
据听说有可能是ajax从后台取 同问吧
有一种是Java做服务器的, 使用一个长连接, 流媒体方式传输数据. 刚刚发现 PHP也支持socket.
似梦飞花 2013-03-28
  • 打赏
  • 举报
回复
据听说有可能是ajax从后台取 同问吧

87,992

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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