最近用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 聊天室相关推荐

  1. swoole 1.79 websocket 聊天室 基于swoole_server

    基于 swoole 1.79 swoole_server 写的 websocket 网页聊天室,基本功能,以供参考 所需环境 php swoole 1.79 redis <a href=&quo ...

  2. 使用Swoole服务搭建简易聊天室

    前言: 之前写过一篇关于swoole的安装搭建的文章.也测试了搭建TCP协议的服务.但是今天我要介绍的是WebSocket协议,WebSoket协议的出现,解决了http协议的很大的一个缺陷.那就是服 ...

  3. swoole+redis(websocket聊天室demo)

    websocket是不同于http的另外一种网络通信协议,能够进行双向通信,基于此,可开发出各种实时通信产品,我简单做了个聊天室demo,顺便分享一下. PHP的swoole扩展,正如作者所说,是PH ...

  4. docker搭建swoole简易聊天室

    docker搭建swoole的简易聊天室 首先pull镜像 docker pull docker.io/kong36088/nginx-php7-swoole 创建容器 docker run --na ...

  5. 可以发送图片文件的php聊天室,基于 Swoole 开发实时在线聊天室(十四):发送图片消息...

    基于 Swoole 开发实时在线聊天室(十四):发送图片消息 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #1 2055 views 0 likes 0 collects 上篇教程我们演示 ...

  6. Swoole实现h5版聊天室笔记

    声明:该聊天室目前只有一对多,一对一的聊天功能,另外,因为没有使用到mysql,所以还存在比较多的缺陷地方,但知道原理就差不多了,这里主要分享下swoole简易的聊天室制作思路. 开发环境:cento ...

  7. 用swoole实现简单IM聊天室demo

    写在前面:本博文内容取自 http://www.php.cn/course/658.html 课程内容,课程讲的不深,但作为swoole入门教程是肯定够了,感兴趣的同学可以去学习一下 博主最近开始学习 ...

  8. swoole 项目实战——实现简单聊天室

    前言:了解了概念之后就应该练练手啦,不然就是语言的巨人,行动的矮子啦 代码仓库 实战 swoole[聊天室] 在线体验 准备工作 需要先看初识 swoole[上],了解基本的服务端 WebSocket ...

  9. vue php聊天室,Laravel + Swoole 打造IM简易聊天室

    Laravel + Swoole 打造IM简易聊天室 最近在学习Swoole,利用Swoole扩展让PHP生动了不少,本篇就来Swoole开发一款简易的IM聊天室 应用场景:实现简单的即时消息聊天室. ...

  10. 微信小程序之swoole/WebSocket创建聊天室(php)

     一.php安装扩展组件Swoole 参考连接 二.配置linux服务器 在站点的配置文件中#SSL-END下面添加代码 location /wss/ {#通过配置端口指向部署websocker的项目 ...

最新文章

  1. 你居然还不知道Mysql存储引擎InnoDB分为内存架构、磁盘架构?
  2. Science:亚硝酸盐氧化细菌在黑暗海洋中的主要作用
  3. 无法访问某个网站_企业网站排名回升后,快速下跌是什么原因?
  4. 计算机机房建设标准.doc,计算机机房建设标准(部分2)
  5. 物理学家杨振宁到底有多厉害?
  6. 西游记里学化学,请收下我的膝盖~ | 今日最佳
  7. MyBatis之查询缓存
  8. C/C++中从文件末尾反向读取N行文件记录(末尾读取文件)
  9. 财政 | 十一月财政总结
  10. java已知 求p_Java 0520 第五次课作业
  11. Delphi7串口通讯实例(含Spcomm控件)
  12. Windows7语言包安装问题
  13. python Pystaller 将python文件打包成exe
  14. 15亿美元买个“便宜货”
  15. z-blog建立博客网站SEO优化细节教程
  16. 游戏手柄按键遥杆值检测
  17. vue 获取元素宽高
  18. Git 工作流的一些经验分享
  19. 怎么能学会做买卖步骤是什么(想做买卖赚钱应该先从什么做起)
  20. GridView 72般绝技 转自清清月儿

热门文章

  1. Beyond compare4激活使用
  2. IE提示“Internet Explorer无法打开站点XX,已终止操作”的解决办法
  3. 回望中国计算机学会CCF十大历史贡献
  4. win7与xp 字体命名问题影响打印
  5. (人才测评)什么是创造力?如何提高创造力?
  6. Linux sed命令详解
  7. 大一到大二的总结与感想
  8. is 简写 缩写_为什么e.g.是for example的缩写?它和i.e.是什么关系?
  9. 汽车维修企业管理【7】
  10. simulink 快捷键 运行_高效使用simulink