1. 程式人生 > >ajax短輪詢+php與服務器交互制作簡易即時聊天網站

ajax短輪詢+php與服務器交互制作簡易即時聊天網站

could 是我 滾動 name blog 四個文件 復制 pan value

主流的Web端即時通訊方案大致有4種:傳統Ajax短輪詢、Comet技術、WebSocket技術、SSE(Server-sent Events)。

本文主要介紹ajax短輪詢的簡易實現方式。

看懂此文需要:ajax基礎,php基礎,mysql基礎,html/jquery基礎

————————————————————————————

本人也是web新手,今天聽說女票在學websocket,還做了個簡易的網站利用廣播和我通信。但是刷新一下數據就沒了。。

我覺得這個還是挺有意思的,,就想著能不能做一個刷新後數據依然存在然後可以實時顯示的呢。。就跟web上的qq一樣。。做一個簡易的對話板

因為我不會websocket,就想著好像ajax可以實現,一查果然可以,原來ajax短輪詢也是一種即時通訊的方案。

於是我心血來潮就開始做了。。

最後結果如下:

技術分享

GIF演示:

技術分享

我本地開兩個瀏覽器自己和自己聊天是完全沒問題的,可以顯示最後聊的12條消息,輸入框輸入後按回車消息實時顯示在最下面,頁面不自動刷新。

後面部署到服務器上和舍友測試了一下也是完全沒問題的,和遠在臺灣的女票測試有時候消息會閃。。應該是網絡問題吧。。畢竟使用的是ajax短輪詢還是挺受網絡影響的。

——————————————————————————————————————————

原理:

輸入框輸入原理:給輸入框賦上按回車的事件,按下回車用ajax把當前選擇的身份和輸入框內的內容提交到後臺,存儲在數據庫中。

顯示聊天記錄的原理:利用ajax從後端獲取數據庫中最後12條的數據(我這裏用了jquery的$.get()方法)。然後設置交互時間,前端不斷從後端獲取數據,我這裏設置的是每0.5秒從後端獲取一次數據並顯示。所以實際使用起來和QQ的效果一樣,基本感受不到對方聊天的延時。

——————————————————————————————————————————

代碼:

chat.html

技術分享
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">

    <!-- jQuery靜態庫。-->
    <script src="http://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script>

    <script type="text/javascript">

        $(document).ready(function (){

            var message = "";
            setInterval(function(){
                getdata();
            },500);

            function getdata() {
                $.get("getdata.php",function (data) {
                    var count = 0;
                    for (a in data){
                        count++;
                    }
                    var show = 0;
                    for (a in data){
                        if ( show >= count-15 ){
                            message += "<p>"+ data[a].username + "" + data[a].message+"</p>";
                            $("#show_message").html(message);
                        }
                        show++;
                    }

                    message = "";
                });
            }

            $("#ckq").keydown(function(e){    //按下鍵盤觸發函數
                if(e.keyCode==13){            //如果按下的是回車
                    var user = $(input:radio:checked).val();
                    $.ajax({
                        url: "chat.php",
                        type: "post",
                        async: false,
                        data: {"in":$("#ckq").val(),"username":user}
                    });
                    getdata();
                    $("#ckq").val("");
                }
            });

        })

    </script>


    <style type="text/css">

    </style>


</head>
<body>

<p id="message">小董與晴晴的對話:</p>
選擇身份:<input type="radio" name="sex" value="小董" checked>小董
<input type="radio" name="sex" value="晴晴">晴晴
<br>
<div id="show_message">
</div>
<input type="text" id="ckq" name="in">

</body>
</html>
技術分享

connection.php:(都是默認用戶名密碼,選擇了我自己的數據庫app_phptest2017,如果有改就改成對應的就行了)

技術分享
<?php
session_start();
error_reporting(0); //。。加這個就不顯示提示
$servername = "localhost";
$username = "root";
$password = "";
//$server_db_name = "app_phptest2017";

$con = mysql_connect($servername,$username,$password);

if (!$con)
{
    die(‘Could not connect: ‘ . mysql_error());
}

mysql_query("set names ‘utf8‘");

mysql_select_db("app_phptest2017", $con);

$sql = "CREATE TABLE IF NOT EXISTS `mymessage` (  
  messageID int NOT NULL AUTO_INCREMENT,
  username char(30) NOT NULL,
  message char(30) NOT NULL,  
  PRIMARY KEY (messageID) 
) ENGINE=InnoDB DEFAULT CHARSET=gbk; "  ;

mysql_query($sql);

?>
技術分享

chat.php (用來插入數據):

技術分享
<?php

include ("connection.php");

$sql = "INSERT INTO mymessage (message,username) VALUES(‘$_POST[in]‘,‘$_POST[username]‘)";
mysql_query($sql);

?>
技術分享

getdata.php (用來從後端獲取json格式數據並輸出):

技術分享
<?php
include ("connection.php");
header(‘content-type:application/json;charset=utf8‘);

$result = mysql_query("select message,username from mymessage");

$results = array();
while ($row = mysql_fetch_assoc($result)) {   //mysql_fetch_assoc() 函數從結果集中取得一行作為關聯數組,返回根據從結果集取得的行生成的關聯數組!,如果沒有更多行,則返回 false。
    $results[] = $row;
}

$jsonResult =  json_encode($results);

echo $jsonResult;

mysql_close();
?>
技術分享

————————————————————————————————

在本地服務器下創建以上四個文件並把代碼復制進去就可以了,大家可以開兩個瀏覽器運行一下試試看。

目前只能顯示最後十二條,之後還可以添加一些滾動欄顯示之前的消息之類的功能,以後再說了,本來也是做著玩。

——————————————————————————————————

結論:初步嘗試了一下Web端即時通訊,還是挺有意思的。然而ajax短輪詢與服務器交互太頻繁了,沒消息的時候總是進行一些無意義的交互,浪費資源,現在這項技術已經被淘汰了,還是學學websocket好。

ajax短輪詢+php與服務器交互制作簡易即時聊天網站