亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > AJAX > 正文

javascript和jQuery實現網頁實時聊天的ajax長輪詢

2024-09-01 08:33:45
字體:
來源:轉載
供稿:網友

介紹

大家都知道,HTTP協議是一個屬于應用層的面向對象的協議,HTTP 協議一共有五大特點:

1、支持客戶/服務器模式;

2、簡單快速;

3、靈活;

4、無連接;

5、無狀態。

所以一次的請求都是一個單獨的事件,和前后都沒有聯系。所以我們在解決網頁實時聊天時就遇到一個問題,如何保證與服務器的長時間聯系,從而源源不段地獲取信息。

一直以來的方式無非有這么幾種:

1、長連接,即服務器端不斷開聯系,PHP服務器端用ob系列函數來不停的讀取輸出,但是相當耗費服務器資源。

2、Flash socket,flash的as3語言,創建一個socket服務器用來處理信息。

3、輪詢,顧名思義就是不停地發送查詢消息,一有新消息立刻更新,但是會有多次無用請求。

4、長輪詢,是輪詢的升級版,需要服務器端的配合。

5、websocket,HTML5的通信功能,建立一個與服務器端的專用接口ws協議來進行通訊,兼容可能成為問題。

這篇博文總結一下用JS和JQ兩種方式(其實不同就是js和jq的實現),實現AJAX長輪詢。

長輪詢的思想:

jquery,ajax,長輪詢,ajax實現實時聊天,聊天室

如圖:用AJAX發送詢問信息,服務器在沒有信息要返回的時候進入無限等待。由于AJAX異步的特性,PHP在服務器端執行等待不會影響到頁面的正常處理。一旦服務器查詢到返回信息,服務器返回信息,AJAX用回調函數處理這條信息,同時迅速再次發送一個請求等待服務器處理。

與傳統輪詢相比,長輪詢在服務器沒的返回信息的時候進入等待,減少了普通輪詢服務器無數次的空回復??梢赃@樣認為,長輪詢使服務器每次的返回更有目的性,而不是盲目返回。

長輪詢的服務器端實現:

聊天信息存儲:

數據庫設計為信息ID(msgid),發送人(sender),接收人(receiver),信息內容(content),設置senderRead和receiverRead的目的是標記信息是否已被讀取,讀取后改變標記,以區別信息是否已經被讀取。

create table msg{  msgid int not null primary key auto_increment,  sender char(16) not null,  receiver char(16) not null,  content text, //信息內容用text類型,存儲量可達到65535字符  senderRead tinyint enum(0,1) default 0,  receiverRead tinyint enum(0,1) default 0 //設置一個是否已讀的flag標記}

PHP腳本

 腳本的主要目的是處理來自ajax的每次詢問,ajax每次詢問就查詢一下數據庫,看有沒有新的信息,如果沒有,剛用usleep()函數等待一秒后再次查詢,直到有新信息插入數據庫并被查到,腳本返回查詢到的數據,并退出無限循環,結束腳本。

set_time_limit(0);//設置腳本超時時間為無限,不然在過了超時時間后腳本會自動關閉,輪詢失敗。 $link=new mysqli("host","user","password","database"); $search="select sender,receiver,content from msg where receiverRead=0 limit 1";//限制每次讀出一條數據,便于修改其已讀flag $change="update chat set receiverRead=1 where receiverRead=0 limit 1"; while (true) { //進入無限循環     $res=$link->query($sql); //查詢結果     if($res->num_rows!=0){ //當有未讀信息時讀取信息        $link->query($change);//將信息的已讀flag設為1        $msg=$res->fetch_assoc();        $jsonstr=json_encode($msg);//取到信息,將信息用轉碼為json格式,返回給JS        echo $jsonstr;        break;//輸出信息后退出while循環,結束當前腳本     }   usleep(1000);//如果沒有信息不會進入if塊,但會執行一下等待1秒,防止PHP因循環假死。 }

客戶端實現:

客戶端的主要任務是設置一個ajax請求函數,每次查詢時被調用,當沒有信息返回時,服務器端被擱置,當前頁面正常執行;當有信息返回時,函數處理返回的數據,并迅速再次調用此函數發送一次請求。

用原生JS:

function link(){ var xhr=null;//先設置xhr為空,為了輪詢時再次調用函數對xhr重用,引發錯誤 xhr=new XMLHttpRequest(); xhr.open('GET','serviceback.php',true);//第三個參數一定要設置為true,異步不阻塞,不會影響到后面JS的執行。 xhr.send(); xhr.onreadystatechange=function(){     if (xhr.readyState==4) { 嚴密也可加使用(xhr.readyState==4 && xhr.status ==200)限定服務器響應碼為200時才進行處理。        if(xhr.responseText!=''){           process... //服務器端返回信息,且返回信息不為空,則開始處理返回信息。        }    setTimeout("link()",300);//遞歸再次調用link()函數,用setTimeOut()設置延時是因為服務器端進行sql操作時會耗時,當有新信息時,在服務器將要置已讀flag為1還未成功時,AJAX可能已經又發出多條查詢信息了,會導致一條信息多次返回。    } };}

用jQuery插件實現:

var link={           //jQuery的AJAX執行的配置對象  type:"GET",      //設置請求方式,默認為GET,  async:true,      //設置是否異步,默認為異步  url:"customback.php",  dataType:"json",    //設置期望的返回格式,因服務器返回json格式,這里將數據作為json格式對待  success:function (msg){      process...     setTimeout("link()",300);  }              //成功時的回調函數,處理返回數據,并且延時建立新的請求連接}$.ajax(link);          //執行ajax請求。
]

程序擴充:

添加發送聊天窗口:

新建一個函數用來處理ajax的POST請求,用ajax將發信人,每次發送的信息,收信人發送到服務器端,并設置一個單獨的PHP腳本處理信息,將信息插入數據庫。

需要注意的是,用JS原生實現POST請求發送信息時,要設置ajax對象的HTTP頭,模擬表單提交的操作:

xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");

聊天室消息處理:

為了防止每次都查詢到全部信息,我們對數據庫的查詢操作更改一下,設置idflag=0,每次查詢后,設置idflag為查詢到的數據的id,查詢時我們查詢比idflag大的ID,即,新添加進去的信息。

好了,本文到此就結束了,利用本文的示例代碼一個簡單的聊天室程序就做好了,感興趣的可以快快實踐下了。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色婷婷av一区二区三区久久| 国产精品黄色av| 国产精品久久久久久超碰| 国产91在线视频| 国产精品久久色| 亚洲第一区在线观看| 在线视频欧美性高潮| 国产美女高潮久久白浆| 成人免费淫片aa视频免费| 日本免费久久高清视频| 久久精品国产久精国产思思| 欧美高跟鞋交xxxxxhd| 久久久久久久久久久网站| 亚洲午夜未满十八勿入免费观看全集| 国产精品久久一区| 亚洲欧美另类国产| 92福利视频午夜1000合集在线观看| 一区二区欧美亚洲| 久久久精品久久久| 国产91色在线|| 久久免费少妇高潮久久精品99| 日韩精品999| 国产精品久久久亚洲| 8x海外华人永久免费日韩内陆视频| 欧美成人激情视频免费观看| 日韩综合中文字幕| 欧美一级大片在线免费观看| 欧美插天视频在线播放| yw.139尤物在线精品视频| 91美女片黄在线观看游戏| 91夜夜揉人人捏人人添红杏| 日本中文字幕久久看| 另类少妇人与禽zozz0性伦| 国产精品爽爽爽爽爽爽在线观看| 最近2019好看的中文字幕免费| 欧美成人午夜视频| 欧美性精品220| 精品国产一区久久久| 国产精品盗摄久久久| 69影院欧美专区视频| 亚洲国产精品久久久久秋霞蜜臀| 久久精品99久久久香蕉| 日本道色综合久久影院| 日韩美女主播视频| 欧美大荫蒂xxx| 97视频免费在线观看| 91精品啪在线观看麻豆免费| 久久精视频免费在线久久完整在线看| 欧美一级视频一区二区| 欧美性猛交xxxx久久久| 成人黄色午夜影院| 亚洲欧美国产一本综合首页| 日韩成人中文字幕在线观看| 日韩电影中文字幕在线观看| 日韩欧美精品网站| 国产欧美va欧美va香蕉在线| 九九热这里只有精品6| 亚洲一区二区精品| 夜夜嗨av一区二区三区免费区| 欧美中文字幕精品| 日韩电影免费观看中文字幕| 国产精品九九九| 中文字幕亚洲欧美日韩高清| 亚洲欧美国产制服动漫| 日韩大片免费观看视频播放| 国产伦精品免费视频| 日韩有码在线播放| 日韩福利伦理影院免费| 91美女高潮出水| 欧美日韩精品在线视频| 91国在线精品国内播放| 精品久久久久久国产91| 九九热这里只有在线精品视| 国产成人激情视频| 欧美丰满少妇xxxxx做受| 色yeye香蕉凹凸一区二区av| 综合久久五月天| 亚洲成人av中文字幕| 日韩美女免费线视频| 精品久久久香蕉免费精品视频| 欧美国产日韩二区| 久久久久久国产精品久久| 精品国产91乱高清在线观看| 亚洲精品色婷婷福利天堂| 国产精品青草久久久久福利99| 搡老女人一区二区三区视频tv| 国产福利成人在线| 欧美日韩性视频| 国产精品久久久久久久久久久新郎| 国产91精品久久久久| 九九九热精品免费视频观看网站| 91精品国产91久久| 国产91在线播放| 国产精品v片在线观看不卡| 欧美专区中文字幕| 精品久久久久久电影| 国产成人亚洲综合91精品| 欧美综合激情网| 91超碰caoporn97人人| 国产一区二区三区精品久久久| 亚洲精品福利在线| 国产精品福利观看| 久久综合免费视频| 亚洲精品久久久久久久久| 亚洲欧洲一区二区三区久久| 久久久999精品免费| 国产精品久久999| 成人精品久久一区二区三区| 日韩www在线| 亚洲最大福利视频网| 欧美精品中文字幕一区| 青草青草久热精品视频在线观看| 欧美成人久久久| 久久久亚洲网站| 在线播放日韩欧美| 国产一区二区色| 国产精品久久久久久久久久东京| 亚洲精品在线视频| 久久青草精品视频免费观看| 亚洲欧美制服另类日韩| 欧美黄色片在线观看| 国产精品成人久久久久| 午夜美女久久久久爽久久| 国产精品∨欧美精品v日韩精品| 久久男人资源视频| 美女久久久久久久久久久| 欧美日韩精品在线视频| 国产一区二区香蕉| 美日韩精品免费观看视频| 久久久久久久久久久久久久久久久久av| 欧美在线精品免播放器视频| 久久69精品久久久久久国产越南| 日本精品久久电影| 欧美成在线视频| 欧美激情视频播放| 亚洲无限av看| 久久精品成人动漫| 久久福利网址导航| 在线一区二区日韩| 国产欧美精品日韩精品| 国产精品91久久久久久| 国产成人小视频在线观看| 国产aⅴ夜夜欢一区二区三区| 久久天堂电影网| 国产精品91一区| 国产一区二区三区高清在线观看| 欧美日韩免费在线观看| 国产精品视频区| 91网站免费看| 色偷偷偷亚洲综合网另类| 欧美猛少妇色xxxxx| 韩国三级电影久久久久久| 欧美日韩在线免费| 国产福利精品视频| 日本韩国欧美精品大片卡二| 日韩精品在线看| 色偷偷亚洲男人天堂| 永久555www成人免费| 亚洲欧美国产日韩天堂区| 在线播放亚洲激情| 国产精品678| 成人高h视频在线| 欧美亚洲另类视频| 亚洲女人天堂成人av在线|