web im的实现方式有很多种:

1.普通轮询,原理通过js定时重复发送ajax请求服务端,获取数据后显示。

2.   长轮询,ajax请求服务端,服务端有数据会立即返回。服务端无数据时会一直等待,直到有数据了才立即返回。

3.socket长连接。



特征分析:

方法1:实现起来最容易,定时重复请求服务端会产生无意义的http连接,消耗服务端资源,实时性较差.

方法2:实现起来较容易,会减少无效的ajax请求产生的http连接,能即时返回数据,但服务端会一直挂着,会消耗一定的资源,处理并发能力不强,比较适合于中小型应用服务.(comet)

方法3:门槛较高,需了解socket通讯协议,是http实现长连接的最佳方式,也是真正意义上的server push技术.


Comet技术简介

  以即时通信为代表的web应用程序对数据的Low Latency(低延时)要求,传统的基于轮询的方式已经无法满足,而且也会带来不好的用户体验。于是一种基于http长连接的“服务器推”技术便被hack出来。这种技术被命名为Comet,这个术语由Dojo Toolkit 的项目主管Alex Russell在博文Comet: Low Latency Data for the Browser首次提出,并沿用下来。

  其实,服务器推很早就存在了,在经典的client/server模型中有广泛使用,只是浏览器太懒了,并没有对这种技术提供很好的支持。但是Ajax的出现使这种技术在浏览器上实现成为可能, google的gmail和gtalk的整合首先使用了这种技术。随着一些关键问题的解决(比如 IE 的加载显示问题),很快这种技术得到了认可,目前已经有很多成熟的开源Comet框架。

  以下是典型的Ajax和Comet数据传输方式的对比,区别简单明了。典型的Ajax通信方式也是http协议的经典使用方式,要想取得数据,必须首先发送请求。在Low Latency要求比较高的web应用中,只能增加服务器请求的频率。Comet则不同,客户端与服务器端保持一个长连接,只有客户端需要的数据更新时,服务器才主动将数据推送给客户端。


本文介绍第二种实现方法

案例名称:web即时聊天(ajax长轮询方式实现)

项目地址:https://github.com/zhangrenjie/web_im_ajax

功能介绍:

  1. 对话双方都在线(浏览器没有关闭的情况下),对话即时推送.

  2. 支持离线发送消息.当离线方上线时,会自动接收离线消息.

  3. 采用确认机制确保数据推送成功.

  4. 采用超时退出机制,降低服务器资源浪费.



~~本项目只注重php服务端的实现机制和性能优化,前端界面粗糙请忽略.适合中级php程序员学习借鉴,欢迎各位指教交流~~


预览


php+ajax长轮询实现web即时聊天_第1张图片



项目文件结构:

GetMessage.php
SendMessage.php
client.php
jquery.min.js
sql



准备工作:数据库

mysql> desc message;
+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10)          | NO   | PRI | NULL    | auto_increment |
| reciver_uid | int(10) unsigned | NO   | MUL | 0       |                |
| sender_uid  | int(10) unsigned | NO   |     | 0       |                |
| content     | varchar(1000)    | NO   |     |         |                |
| create_time | int(10) unsigned | NO   |     | 0       |                |
| status      | tinyint(1)       | NO   |     | 0       |                |
+-------------+------------------+------+-----+---------+----------------+


客户端Client.php

实现功能:1.发送聊天信息,2即时获取并显示聊天内容


页面基本结构