PHP+swoole实现简单的聊天消息推送

2020-09-21   阅读:128   分类:后端    标签: swoole

Swoole 使 PHP 开发人员可以编写高性能高并发的 TCP、UDP、Unix Socket、HTTP、 WebSocket 等服务,让 PHP 不再局限于 Web 领域。Swoole4 协程的成熟将 PHP 带入了前所未有的时期, 为性能的提升提供了独一无二的可能性。Swoole 可以广泛应用于互联网、移动通信、云计算、 网络游戏、物联网(IOT)、车联网、智能家居等领域。使用 PHP + Swoole 可以使企业 IT 研发团队的效率大大提升,更加专注于开发创新产品。

2.jpg

以下是一个简单的使用php+swoole实现简单的聊天消息推送

思路逻辑:

连接swoole服务并且发送消息到swoole服务

swoole服务接收到发送的信息并且发送给连接到swoole上的其他客户端

其他客户端通过webscoket监听swoole服务发送过来的消息并输出

image.png

效果展示:

GIF.gif

一、客户端代码编写:

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

【腾讯云】11.11 云上盛惠,云产品限时抢购,1核2G云服务器首年88元

‘简忆博客’微信公众号 扫码关注‘简忆博客’微信公众号,获取最新文章动态
转载:请说明文章出处“来源简忆博客”。http://www.tpxhm.com/adetail/437.html

×
觉得文章有用就打赏一下文章作者
微信扫一扫打赏 微信扫一扫打赏
支付宝扫一扫打赏 支付宝扫一扫打赏

文章评论(0)

登录
头像

简忆博客
仕而优则学,学而优则仕。

置顶推荐

打赏本站

如果你觉得本站很棒,可以通过扫码支付打赏哦!
微信扫码:你说多少就多少~
微信扫码
支付宝扫码:你说多少就多少~
支付宝扫码
×