Swoole 使 PHP 开发人员可以编写高性能高并发的 TCP、UDP、Unix Socket、HTTP、 WebSocket 等服务,让 PHP 不再局限于 Web 领域。Swoole4 协程的成熟将 PHP 带入了前所未有的时期, 为性能的提升提供了独一无二的可能性。Swoole 可以广泛应用于互联网、移动通信、云计算、 网络游戏、物联网(IOT)、车联网、智能家居等领域。使用 PHP + Swoole 可以使企业 IT 研发团队的效率大大提升,更加专注于开发创新产品。
以下是一个简单的使用php+swoole实现简单的聊天消息推送
思路逻辑:
连接swoole服务并且发送消息到swoole服务
swoole服务接收到发送的信息并且发送给连接到swoole上的其他客户端
其他客户端通过webscoket监听swoole服务发送过来的消息并输出
效果展示:
一、客户端代码编写:
index.html页面
展示消息客户端,添加消息客户端
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>聊天客户端</title> <meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" name="viewport"> <script src="https://libs.baidu.com/jquery/2.1.1/jquery.min.js"></script> </head> <body> <div class="dd"> <div class="head"> <h1>聊天客户端</h1> </div> <ul class="line" id="line"> </ul> <div class="hr"></div> <div class="footer"> <input type="text" class="content" id="content"> <button type="button" class="sub" id="sender">发送</button> </div> </div> </body> </html>
javascript代码:
<script> //格式化时间函数,用于显示发送消息时间 Date.prototype.Format = function (fmt) { // author: meizz var o = { "M+": this.getMonth() + 1, // 月份 "d+": this.getDate(), // 日 "h+": this.getHours(), // 小时 "m+": this.getMinutes(), // 分 "s+": this.getSeconds(), // 秒 "q+": Math.floor((this.getMonth() + 3) / 3), // 季度 "S": this.getMilliseconds() // 毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt; } $(function(){ // 使用webscoket作为客户端连接到websoket服务器上 // 1、创建webscoket客户端 var websocket = new WebSocket("ws://125.212.443.206:9502"); // 2、注册事件 //2.1、当客户端和服务器建立连接时执行回调函数 websocket.onopen = function(){ console.log("连接上了服务器"); // websocket.send("客户端发送的信息给服务器"); } //2.2、当服务器向客户端发送消息时该函数执行 //event.data就是服务器发送过的信息 websocket.onmessage = function(event){ console.log("接收到的服务器发送信息:"+event.data); var now = new Date(); var oTalk_sub = document.getElementById('content'); var oWords = document.getElementById('line'); var sTalk = '<li><p><b>'+ now.Format("hh:mm:ss")+'</b></p><img src="tx.jpg" alt="" /><span><img src="jt_03.png" alt="" /><strong>'+event.data+'</strong></span> ' '</li>' oWords.innerHTML = oWords.innerHTML + sTalk oWords.scrollTop = oWords.scrollHeight; } //2.3、当客户端和服务器断开连接时该函数执行 websocket.onclose = function(){ console.log("断开了连接"); } $('#sender').click(function(){ //1、得到文本内容 var content=$('#content').val(); if(content==''){ alert('请输入聊天内容') return false; } //2、将文本内容发送给服务器 websocket.send(content); $('#content').val(''); }) }) </script>
二、服务器端代码PHP代码编写 server.php
创建webscoket服务器,创建Server对象,监听 0.0.0.1:9502 端口
监听WebSocket消息事件
*客户端连向服务器时发送消息时调用回调函数
*$server: webscoket服务器
*$frame: 客户端发送的消息
*$frame->fd: 客户端的唯一编号
*$frame->data: 客户端发送的信息文本内容
*$server->push(客户端唯一的编号,“消息内容”): 服务器向指定的客户端发送消息
<?php // 1、创建webscoket服务器 //创建Server对象,监听 0.0.0.0:9502 端口 /* 客户端连接webscoket服务器时执行该事件中的回调函数 $server: webscoket服务器 $req: 客户信息 $req->fd: 客户端的唯一编号 */ $server = new Swoole\WebSocket\Server('0.0.0.0', 9502); //监听WebSocket连接打开事件 $server->on('open', function ($server, $req) { echo 'connection open:{$req->fd}\n'; }); //监听WebSocket消息事件 /* *客户端连向服务器时发送消息时调用回调函数 *$server: webscoket服务器 *$frame: 客户端发送的消息 *$frame->fd: 客户端的唯一编号 *$frame->data: 客户端发送的信息文本内容 *$server->push(客户端唯一的编号,“消息内容”): 服务器向指定的客户端发送消息 */ $server->on('message', function ($server, $frame) { //echo "received message: {$frame->data}\n"; //$server->push($frame->fd, json_encode(['hello','world'])); //1、接收客户端发送过来的消息 $content = $frame->data; //2、将该消息发送给所有客户端 foreach ($server->connections as $fd) { //$fd每个客户端 $server->push($fd,$content); //将接收到的信息发送给每个客户端 } }); //监听WebSocket连接关闭事件 /* *客户端和服务器关闭连接之后回调函数执行 *$server:webscoket服务器 *$fd:客户端的唯一编号 *不管是关闭客户端还是服务器自己断开,该函数都会执行 */ $server->on('close', function ($server, $fd) { echo "connection close-{$fd}\n"; }); //3、webscoket服务器启动 $server->start(); // 2、在webscoket服务器上添加时间 ?>
进入打server.php文件夹下,运行server.php脚本文件
php server.php
文章评论(0)