PHP-swoole 聊天室
最近用Swoole写了一个聊天室 http://cs.whliu.com/blog/chat/swoole
下面发下聊天室的代码
server.php
<?php
require_once("redisDb.php" ); //自己简单些的redis类
require_once("rndChinaName.php" ); //用于随机生成名字
class server{private $redis;private $randName;public function __construct(){$this->redis = new redisDb();$this->randName = new rndChinaName();$this->redis->flushAll();echo "redis is connect";}public function getChar($num) // $num为生成汉字的数量{$b = '';for ($i=0; $i<$num; $i++) {// 使用chr()函数拼接双字节汉字,前一个chr()为高位字节,后一个为低位字节$a = chr(mt_rand(0xB0,0xD0)).chr(mt_rand(0xA1, 0xF0));// 转码$b .= iconv('GB2312', 'UTF-8', $a);}return $b;}public function getName(){return $this->randName->getName();}public function socket(){//创建websocket服务器对象,监听0.0.0.0:9502端口$ws = new swoole_websocket_server("0.0.0.0", 9502);$ws->set([
// 'socket_buffer_size' => 128 * 1024 *1024, //必须为数字'worker_num' => 2,'task_worker_num' =>4,]);//监听WebSocket连接打开事件$ws->on('open', function ($ws, $request) {$room = "xyf";$name = $this->getName();$this->redis->hset($room,$request->fd,$name);$Pnum = $this->redis->hlen($room);$json = array('type'=>'3','message'=>"欢迎 <span class='text-navy'>$name</span> 加入聊天室",'time'=>date('Y-m-d H:i:s',time()),'num'=>"在线人数:".$Pnum);$str = json_encode($json);foreach($ws->connections as $fd){$ws->push($fd,$str);}});//监听WebSocket消息事件$ws->on('message', function ($ws, $frame) {echo "message:{$frame->data}";$task_id = $ws->task($frame); });//监听WebSocket连接关闭事件$ws->on('close', function ($ws, $fd) {$name = $this->redis->hget("xyf",$fd);$this->redis->hdel("xyf",$fd);$Pnum = $this->redis->hlen("xyf");$json = array('type'=>'3','message'=>"<span class='text-navy'>$name</span> 离开聊天室",'time'=>date('Y-m-d H:i:s',time()),'num'=>"在线人数:".$Pnum);$str = json_encode($json);foreach($ws->connections as $fd1){if($fd1 != $fd){$ws->push($fd1,$str);}}echo "client-{$fd} is closed\n";});$ws->on('Receive', function(swoole_server $ws, $fd, $from_id, $data) {echo "接收数据" . $data . "\n";$data = trim($data);$task_id = $ws->task($data, 0); $ws->send($fd, "分发任务,任务id为$task_id\n");});$ws->on('Task', function (swoole_server $ws, $task_id, $from_id,$frame) {echo "Tasker进程接收到数据";foreach($ws->connections as $fd){echo "task_id:".$task_id."\n";$num = $frame->fd%10;$data = htmlspecialchars($frame->data);$name = $this->redis->hget("xyf",$frame->fd);if($fd==$frame->fd){$json = array('name'=>"$name",'message'=>"$data",'time'=>date('Y-m-d H:i:s',time()),'type'=>'1','img'=>$num);}else{$json = array('name'=>"$name",'message'=>"$data",'time'=>date('Y-m-d H:i:s',time()),'type'=>'2','namet'=>"中文",'img'=>$num);}$str = json_encode($json,JSON_UNESCAPED_UNICODE);$ws->push($fd,$str);}$ws->finish($data);});$ws->on('Finish', function (swoole_server $ws, $task_id, $data) {echo "Task#$task_id finished, data_len=".strlen($data).PHP_EOL."\n";});$ws->start();}
}
$wser = new server();
$wser->socket();
?>
index.html 客户端页面
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>PHP聊天室</title><meta name="keywords" content="PHP聊天室"><meta name="description" content="PHP聊天室"><link rel="shortcut icon" href="favicon.ico"> <link href="css/bootstrap.min.css?v=3.3.6" rel="stylesheet"><link href="css/font-awesome.css?v=4.4.0" rel="stylesheet"><link href="css/plugins/jsTree/style.min.css" rel="stylesheet"><link href="css/animate.css" rel="stylesheet"><link href="css/style.css" rel="stylesheet"><!--?v=4.1.0 -->
<style>.wrapper-content{padding:0px;}.ibox{margin-bottom: 0px; }.ibox-title{height:10vh;}.chat-discussion{min-height:74vh; }.chat-message-form{height:14vh;}#message{height:14vh;}.alert{padding:4px 8px;text-align:center;width:auto;font-size: 4px;border-radius:10px;}.come{padding:5px;margin-bottom:5px;}
</style>
</head><body class="gray-bg"><div class="wrapper wrapper-content animated fadeInRight"><div class="row"><div class="col-sm-12"><div class="ibox chat-view"><div class="ibox-title"><center><h4 class="text-navy">PHP-Swoole聊天室<span class="pull-right label label-primary" id="num"></span></h4></center></div><div class="ibox-content"><div class="row"><div cass="col-md-12"><div class="chat-discussion"></div></div><div class="col-sm-12"><div class="chat-message-form"><textarea class="form-control" name="message" id="message" placeholder="输入消息内容,按回车键发送"></textarea></div></div></div></div></div></div></div></div><!-- 全局js --><script src="js/jquery.min.js?v=2.1.4"></script><script src="js/bootstrap.min.js?v=3.3.6"></script><script src="js/message.js?v=1.0.5"></script><!-- 自定义js -->
</body>
</html>
message.js 客户端websocket的连接
if(window.WebSocket){var webSocket = new WebSocket("ws://服务端IP:端口号");webSocket.onopen = function (event) {};webSocket.onmessage = function (event) {
// console.log(event.data);var data = JSON.parse(event.data);
// console.log(event.data);var message = "";if(data.type==3){$('#num').html(data.num);message += '<center><p class="come"><span class="alert alert-success">'+data.message+'</span></p></center>';}else{if(data.type==1){message += '<div class="chat-message">';}else{message += '<div class="chat-message1">';}message += '<img class="message-avatar" src="img/a'+data.img+'.jpg" alt="">';message += '<div class="message">'message += '<span class="message-author">'+data.name+'</span>';message += '<span class="message-date">'+data.time+'</span>';message += '<span class="message-content">'+data.message+'</span>';message += '</div>';message += '</div>';}$('.chat-discussion').append(message);$(".chat-discussion").scrollTop($(".chat-discussion")[0].scrollHeight);};var sendMessage = function(){var message = $('#message').val();if($.trim(message)==""){$('#message').val("");return false;}else{webSocket.send(message);$('#message').val("");}}}else{console.log("您的浏览器不支持WebSocket");}$(document).keyup(function(event){if(event.keyCode ==13){sendMessage();}});
以上是主要的代码内容,若有什么疑问可以在下面留言
PHP-swoole 聊天室相关推荐
- swoole 1.79 websocket 聊天室 基于swoole_server
基于 swoole 1.79 swoole_server 写的 websocket 网页聊天室,基本功能,以供参考 所需环境 php swoole 1.79 redis <a href=&quo ...
- 使用Swoole服务搭建简易聊天室
前言: 之前写过一篇关于swoole的安装搭建的文章.也测试了搭建TCP协议的服务.但是今天我要介绍的是WebSocket协议,WebSoket协议的出现,解决了http协议的很大的一个缺陷.那就是服 ...
- swoole+redis(websocket聊天室demo)
websocket是不同于http的另外一种网络通信协议,能够进行双向通信,基于此,可开发出各种实时通信产品,我简单做了个聊天室demo,顺便分享一下. PHP的swoole扩展,正如作者所说,是PH ...
- docker搭建swoole简易聊天室
docker搭建swoole的简易聊天室 首先pull镜像 docker pull docker.io/kong36088/nginx-php7-swoole 创建容器 docker run --na ...
- 可以发送图片文件的php聊天室,基于 Swoole 开发实时在线聊天室(十四):发送图片消息...
基于 Swoole 开发实时在线聊天室(十四):发送图片消息 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #1 2055 views 0 likes 0 collects 上篇教程我们演示 ...
- Swoole实现h5版聊天室笔记
声明:该聊天室目前只有一对多,一对一的聊天功能,另外,因为没有使用到mysql,所以还存在比较多的缺陷地方,但知道原理就差不多了,这里主要分享下swoole简易的聊天室制作思路. 开发环境:cento ...
- 用swoole实现简单IM聊天室demo
写在前面:本博文内容取自 http://www.php.cn/course/658.html 课程内容,课程讲的不深,但作为swoole入门教程是肯定够了,感兴趣的同学可以去学习一下 博主最近开始学习 ...
- swoole 项目实战——实现简单聊天室
前言:了解了概念之后就应该练练手啦,不然就是语言的巨人,行动的矮子啦 代码仓库 实战 swoole[聊天室] 在线体验 准备工作 需要先看初识 swoole[上],了解基本的服务端 WebSocket ...
- vue php聊天室,Laravel + Swoole 打造IM简易聊天室
Laravel + Swoole 打造IM简易聊天室 最近在学习Swoole,利用Swoole扩展让PHP生动了不少,本篇就来Swoole开发一款简易的IM聊天室 应用场景:实现简单的即时消息聊天室. ...
- 微信小程序之swoole/WebSocket创建聊天室(php)
一.php安装扩展组件Swoole 参考连接 二.配置linux服务器 在站点的配置文件中#SSL-END下面添加代码 location /wss/ {#通过配置端口指向部署websocker的项目 ...
最新文章
- 你居然还不知道Mysql存储引擎InnoDB分为内存架构、磁盘架构?
- Science:亚硝酸盐氧化细菌在黑暗海洋中的主要作用
- 无法访问某个网站_企业网站排名回升后,快速下跌是什么原因?
- 计算机机房建设标准.doc,计算机机房建设标准(部分2)
- 物理学家杨振宁到底有多厉害?
- 西游记里学化学,请收下我的膝盖~ | 今日最佳
- MyBatis之查询缓存
- C/C++中从文件末尾反向读取N行文件记录(末尾读取文件)
- 财政 | 十一月财政总结
- java已知 求p_Java 0520 第五次课作业
- Delphi7串口通讯实例(含Spcomm控件)
- Windows7语言包安装问题
- python Pystaller 将python文件打包成exe
- 15亿美元买个“便宜货”
- z-blog建立博客网站SEO优化细节教程
- 游戏手柄按键遥杆值检测
- vue 获取元素宽高
- Git 工作流的一些经验分享
- 怎么能学会做买卖步骤是什么(想做买卖赚钱应该先从什么做起)
- GridView 72般绝技 转自清清月儿
热门文章
- Beyond compare4激活使用
- IE提示“Internet Explorer无法打开站点XX,已终止操作”的解决办法
- 回望中国计算机学会CCF十大历史贡献
- win7与xp 字体命名问题影响打印
- (人才测评)什么是创造力?如何提高创造力?
- Linux sed命令详解
- 大一到大二的总结与感想
- is 简写 缩写_为什么e.g.是for example的缩写?它和i.e.是什么关系?
- 汽车维修企业管理【7】
- simulink 快捷键 运行_高效使用simulink