反向 ajax 又叫 comet / server push / 服务器推技术

应用范围:网页聊天服务器,例如新浪微博在线聊天、google mail 网页聊天

原理:一般而言,HTTP 协议的特点是,连接之后断开连接(服务器响应 Content-Length,收到了指定 Length 长度的内容时,也就断开了)。在 HTTP 1.1 协议中,允许不写 Content-Length,比如要发送的内容长度确实不知道,此时需要一个特殊的 Content-Type:chunked,叫做分块传输,只有当服务器最后发送 0\r\n,在表明服务器和客户端的此次连接彻底结束。

【例】

<?php
set_time_limit(0);
//ob_start();
$pad = str_repeat(' ', 4000);
echo $pad,'<br />';
ob_flush();
flush();//把产生的内容立即发送给浏览器而不是等脚本结束再一起发送 $i = 1;
while($i++){
echo $pad,'<br>';
echo $i,'<br>';
ob_flush();
flush();
sleep(1);
}

执行页面:

  

2,3,4,5..源源不断地输出。

当输出的值是数据库中的数据(可以是聊天记录),就可以实现即时通信。

新建数据库 msg,新建表 message:

CREATE TABLE `message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`content` varchar(200) NOT NULL COMMENT '聊天内容',
`flag` int(11) NOT NULL DEFAULT '0' COMMENT '0-未读 1-已读',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

修改 comet.php:

<?php
set_time_limit(0);
//ob_start();
$pad = str_repeat(' ', 4000);
echo $pad,'<br />';
ob_flush();
flush();//把产生的内容立即发送给浏览器而不是等脚本结束再一起发送 //连接数据库
$conn = mysql_connect('localhost', 'root', '');
mysql_query('use msg'); while(1){
$sql = 'select * from message where flag = 0';
$rs = mysql_query($sql, $conn);
$row = mysql_fetch_assoc($rs);
if(!empty($row)){
echo $pad,'<br />';
echo $row['content'],'<br />';
mysql_query('update message set flag = 1');
} ob_flush();
flush();
sleep(1);
}

同时在命令行中运行 mysql,插入数据:

C:\Users\Administrator>D:

D:\>cd wamp/bin/mysql/mysql5.5.20/bin

D:\wamp\bin\mysql\mysql5.5.20\bin>mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.5.20-log MySQL Community Server (GPL) Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use msg
Database changed
mysql> insert into message values (1,'hello',0);
Query OK, 1 row affected (0.03 sec) mysql> insert into message values (2,'world',0);
Query OK, 1 row affected (0.00 sec) mysql>

此时页面的效果是:每插入一条数据,该数据就在页面中立即输出

  

该技术就叫 comet / server push / 反向 ajax 技术。

  

可以使用 Node.js(长连接)+Redis(队列服务器)+ PHP + comet(反向 ajax) 实现更好的即时聊天。

参考:http://www.zixue.it/thread-15089-1-1.html

HTTP 笔记与总结(9)分块传输、持久链接 与 反向 ajax(comet / server push / 服务器推技术)的更多相关文章

  1. php开发客服系统(持久连接+轮询+反向ajax 转载 http://www.tuicool.com/articles/2mU7v2R)

    php开发客服系统( 下载源码 ) 用户端(可直接给客户发送消息) 客服端(点击用户名.即可给该用户回复消息) 讲两种实现方式: 一:iframe + 服务器推技术comet(反向ajax,即服务器向 ...

  2. php开发客服系统(持久连接+轮询+反向ajax)

    欢迎在php严程序 - php教程学习AJAX教程, 本节课讲解:php开发客服系统(持久连接+轮询+反向ajax) php开发客服系统(下载源码) 用户端(可直接给客户发送消息)客服端(点击用户名. ...

  3. 利用分块传输吊打所有WAF--学习笔记

    在看了bypassword的<在HTTP协议层面绕过WAF>之后,想起了之前做过的一些研究,所以写个简单的短文来补充一下文章里“分块传输”部分没提到的两个技巧. 技巧1 使用注释扰乱分块数 ...

  4. HTTP分块传输

    HTTP分块传输 用途 对于在发送HTTP头部前,无法计算出Content-Length的HTTP请求及回复(例如WEB服务端产生的动态内容),可以使用分块传输,使得不至于等待所有数据产生后,再发送带 ...

  5. Burpsuit分块传输插件绕WAF原理和技巧(转)

      0x00 原理 给服务器发送payload数据包,使得waf无法识别出payload,当apache,tomcat等web容器能正常解析其内容.如图一所示 0x02  实验环境 本机win10+x ...

  6. HTTP协议响应头之Transfer-Encoding:分块传输详解

    Http Connection有两种连接方式:短连接和长连接:短连接即一次请求对应一次TCP连接的建立和销毁过程,而长连接是多个请求共用同一个连接这样可以节省大量连接建立时间提高通信效率.目前主流浏览 ...

  7. (转)live555学习笔记10-h264 RTP传输详解(2)

    参考: 1,live555学习笔记10-h264 RTP传输详解(2) http://blog.csdn.net/niu_gao/article/details/6936108 2,H264 sps ...

  8. HTTP要点概述:七,编码,压缩传输,分块传输

    一,编码: HTTP 在传输数据时可以按照数据原貌直接传输,但也可以在传输过程中通过编码提升传输速率.通过在传输时编码,能有效地处理大量的访问请求.但是,编码的操作需要计算机来完成,因此会消耗更多的 ...

  9. HTTP 响应的分块传输

    Transfer-Encoding 响应头用于告诉客户端服务器发送内容的编码格式. 其可选值有: chunked:数据分块发送.此时应缺省 Content-Length 响应头. compress:使 ...

随机推荐

  1. oracle 10g 学习之单行函数(5)

    目标 通过本章学习,您将可以: l  SQL中不同类型的函数. l  在 SELECT 语句中使用字符,数字和日期函数. l  描述转换型函数的用途. 字符函数 字符函数分为大小写控制函数和字符控制函 ...

  2. Sonar+Hudson+Maven构建系列之一:安装Sonar

    摘要:本系列讲述Sonar在Linux下安装及配置过程,windows下的安装类似,会更简单. 本人经过一翻摸索,终于将Sonar+Hudson+Maven配置成功,并使用Hudson进行自动构建,发 ...

  3. 从源码编译Chrome(chromium)

    转自:http://www.udpwork.com/item/13827.html 官网描述 http://www.chromium.org/developers/how-tos/build-inst ...

  4. N个数的排列算法

    #include <stdio.h> int n = 0; //交换两个数void swap(int *a, int *b) { int m; m = *a; *a = *b; *b = ...

  5. Java运算符优先级(转)

    转自:http://www.cnblogs.com/gw811/archive/2012/10/13/2722752.html Java运算符优先级 序列号 符号 名称 结合性(与操作数) 目数 说明 ...

  6. 解决:Google代码achartengine曲线代码报错问题(转)

    原文地址链接 官网:http://code.google.com/p/achartengine/ 下载代码部署项目会报下面的错误: java.lang.NoClassDefFoundError: or ...

  7. 把Chrome浏览器变成文本编辑器

    CoderWall 分享的一个小技巧. 在浏览器地址栏中输入一行代码:data:text/html, <html contenteditable> ,回车即可把浏览器变临时编辑器. 按f1 ...

  8. PHP 读取逐条数据库记录,以及提交下拉菜单选项

    <?php $db_host=localhost; //MYSQL服务器名$db_user=root; //MYSQL用户名$db_pass="******"; //MYSQ ...

  9. 2016.6.17 计算机网络复习要点之PPP协议

    点对点协议PPP是目前使用最广泛的数据链路层协议. 1.PPP协议的特点: **我们知道因特网用户通常需要连接到某个ISP才能接入到因特网,PPP协议就是用计算机和ISP进行通信时所使用的数据链路层协 ...

  10. .NET 4.0中的泛型的协变和逆变

    转自:http://www.cnblogs.com/jingzhongliumei/archive/2012/07/02/2573149.html 先做点准备工作,定义两个类:Animal类和其子类D ...