基于html5的sse推送实现在线聊天

HTML5 服务器推送事件(Server-sent Events) 利用html5的及时推送技术与php+mysql+ajax一些技术完成一款在线聊天室实例。sse推送默认为3秒时间,echo "retry:1000\n"来修改为1s,基础代码:

基于html5的sse推送实现在线聊天

index.php

<?php 
class TalkController{

    private static $pdo = NULL;

    public function __construct(){
        if($_GET['a'] != 'login' && !isset($_SESSION['nickname'])){
            header('Location:index.php?a=login');
        }

        if(is_null(self::$pdo)){
            try{
                $dsn = 'mysql:host=localhost;dbname=talk';
                $pdo = new PDO($dsn, 'root', '', array(PDO::ATTR_PERSISTENT=>TRUE));
                $pdo->query('SET NAMES UTF8');
                self::$pdo = $pdo;
            }catch(Exception $e){
                die('connect error ...');
            }
        }

    }

    public function index(){
        include './show.html';
    }

    public function get(){
        header('Content-Type:text/event-stream');
        header('Cache-Control:no-chache');
        $sql = "select * from message order by time asc limit 15";
        $result = self::$pdo->query($sql);
        $rows = $result->fetchAll(PDO::FETCH_ASSOC);

        foreach($rows as $v){
            $time = date('H:i:s', $v['time']);
            echo "data:[$time] <span style='color:#35EC3B;'>{$v['nickname']}</span>: {$v['content']}<br/>\n";
        }
        echo "retry:1000\n";//默认3秒
        echo "\n\n";
        ob_flush();
        flush();

    }

    public function put(){
        $content = htmlspecialchars($_POST['content']);
        $time = time();
        $nickname = $_SESSION['nickname'];
        $sql = "INSERT INTO message(content, time, nickname) values('{$content}', {$time}, '{$nickname}')";
        self::$pdo->exec($sql);
    }

    public function login(){
        if(!empty($_POST)){
            $_SESSION['nickname'] = htmlspecialchars($_POST['nickname']);
            header('Location:index.php');
        }
        include './login.html';
    }

}

session_start();
date_default_timezone_set('PRC');
$action = $_GET['a'] = isset($_GET['a']) ? htmlspecialchars($_GET['a']) : 'index';
$controller = new TalkController;


$controller->$action();

?>

login.html

<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title>SSE简易聊天演示</title>
    <style type="text/css">
        *{margin: 0;padding: 0;}
        .wrap{position: fixed;left: 50%;top: 50%;width: 300px;height:100px;margin-left: -150px;margin-top: -50px;}
        input{height: 35px;line-height: 35px;padding: 0 10px;}
    </style>
</head>
<body>
    <div class="wrap">
        <form action="" method="post">
            <input type="text" name="nickname" id="" placeholder="输入昵称">
            <input type="submit" value="加入聊天">
        </form>
    </div>
</body>
</html>

show.html

<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <title>SSE简易聊天演示</title>
    <style type="text/css">
        *{margin: 0;padding: 0;}
        .container{position: fixed;left: 50%;top: 50%;width: 600px;height:400px;margin-left: -300px;margin-top: -200px;}
        input{height: 35px;line-height: 35px;padding: 0 10px;}
        #msg-div{height: 330px;width: 580px;padding:10px;background: #333;color: #fff;}
    </style>
</head>
<body>
    <div class="container">
        <div id="msg-div">
            
        </div>
        <form action="javascript:;">
            <input type="text" required name="message" id="" placeholder="">
            <input type="submit" value="发送">
        </form>
    </div>

<script type="text/javascript" src="http://www.huarongyuemao.com.cn/templets/mask/js/jquery.js"></script>
<script type="text/javascript">
    var evtSource;
    function get(){
        evtSource = new EventSource('index.php?a=get');
        evtSource.onmessage = function(e){
            $('#msg-div').html(e.data);
        }
    }
    get();

    $('form').submit(function(){
        var input = $('input[name=message]');
        var msg = input.val();
        $.ajax({
            type: 'post',
            url:'index.php?a=put',
            data:{content:msg}
        });
        input.val('');
    })
</script>
</body>
</html>

Tags: html5

添加新评论