Workerman创建聊天室实例
// 标记是全局启动
define('GLOBAL_START', 1); require_once __DIR__ . '/Workerman/Connection.php';
require_once __DIR__ . '/Workerman/Autoloader.php'; use Workerman\Worker;
use Workerman\Lib\Timer; // 心跳间隔25秒
define('HEARTBEAT_TIME', 25); // 设置时区
date_default_timezone_set('PRC'); // 以websocket协议为例
// Create a Websocket server
$ws = new Worker("websocket://118.xxx.xxx.xx:4980"); // 启动4个进程对外提供服务
$ws->count = 4; // 已连接客户端 ,便于统计在线用户
$ws->hasConnections = array(); // 当新客户端连上来时分配uid,并保存连接,并通知所有客户端
$ws->onConnect = function($connection)
{
global $ws;
// 为这个链接分配一个uid
$connection->uid = ++$global_uid; foreach ($ws->connections as $conn) {
$conn->send("用户{$connection->uid} 已上线");
}
$connection->close(); // 关闭socket连接
// echo "New connection\n";
}; // 当客户端发送消息过来时,转发给所有人 (聊天主要使用的功能)
$ws->onMessage = function($connection, $message)
{
global $ws,$db;
$data = json_decode($message, true); $data['time'] = date('Y-m-d H:i:s');
$insert = array(
'uid' =>$data['uid'],
'avatar' =>$data['avatar'],
'name' =>$data['name'],
'type' =>$data['type'],
'content' =>$data['content'],
'img_path' =>$data['img_path'],
'voice_path' =>$data['voice_path'],
'topic_id' =>$data['topic_id'],
'is_question' =>$data['is_question'],
'status' =>$data['status'],
'time' =>$data['time']
); switch ($data['type']) {
case 'save':
// 把房间和用户信息保存下来
$ws->hasConnections[$connection->id] = array('name' => $data['name'], 'uid' => $data['uid'], 'topic_id' => $data['topic_id'], 'avatar' => $data['avatar']);
sendMessage($data, $data['topic_id']);
// $back_data = array('content' => $content, 'client_id' => $connection->id, 'client_name' => $data['name'], 'type' => 'login', 'clients' => $ws->hasConnections, 'time' => date('Y-m-d H:i:s')); break; case 'text':
sendMessage($data, $data['topic_id']);
$insert_id = $db->insert('chat_record')->cols($insert)->query(); // 存数据库 save data
break; case 'img':
sendMessage($data, $data['topic_id']);
$insert_id = $db->insert('chat_record')->cols($insert)->query(); // 存数据库 save data
break; case 'voice':
sendMessage($data, $data['topic_id']);
$insert_id = $db->insert('chat_record')->cols($insert)->query(); // 存数据库 save data
break;
default:
break;
} // $connection->close(); // 关闭socket连接
}; // 当客户端断开时,广播给所有客户端
// $ws->onClose = function($connection)
// {
// global $ws;
// foreach ($ws->connections as $conn) {
// $conn->send("用户[{$connection->uid}] 消消走了");
// }
// $connection->close(); // 关闭socket连接
// }; // 给房间的每个人发消息
function sendMessage($data, $topic_id){
global $ws;
$data = json_encode($data);
foreach ($ws->connections as $id => $conn) {
if ($ws->hasConnections[$id]['topic_id'] == $topic_id) {
$conn->send($data);
// $conn->send($ws->hasConnections[$id]);
}
}
} // 进程启动后设置一个每秒运行一次的定时器(心跳, 保持长连接)
$ws->onWorkerStart = function($ws) {
global $db;
// ip, 端口号, 账号, 密码, 库名
$db = new \Workerman\MySQL\Connection('127.0.0.1', '3306', 'username', 'password', 'database'); Timer::add(1, function()use($ws){
// global $ws;
$arr = array('type'=>'keep','content'=>'ping');
$arr = json_encode($arr);
foreach($ws->connections as $connection) {
$connection->send($arr);
}
});
}; // Run worker
Worker::runAll();
Workerman创建聊天室实例的更多相关文章
- SignalR 聊天室实例详解(服务器端推送版)
翻译自:http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room (在这里可以下载到实例的源码) Asp.Net Si ...
- laravel整合workerman做聊天室
测试工具 http://www.blue-zero.com/WebSocket/ 2018年8月6日17:28:24 <?php namespace App\Console\Commands; ...
- Java NIO 聊天室实例
最近写了个Java NIO聊天室聊天的程序,NIO学习起来比较困难的,我的代码能给大家起到一个抛砖引玉的作用! 服务端: package test.javanio; /** * @author * @ ...
- workerman搭建聊天室
首先,先打开官网手册 http://doc.workerman.net/ 根据手册里安装里的提示,完成环境检测,和安装对应的扩展,并把对应的WorkerMan代码包下载解压至根目录 在根目录下创建 ...
- 使用signalR创建聊天室。
浏览器支持Html5的情况下,SignalR使用WebSockets,当不支持时SignalR将使用其它技术来实现通讯. 界面如下:左侧包含三种聊天对象,不同的聊天对象会创建不同的对话框. 设计思路参 ...
- 史上最全面的SignalR系列教程-6、SignalR 实现聊天室
1.概述 通过前面几篇文章对SignalR的详细介绍.我们知道Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long po ...
- electron聊天室|vue+electron-vue仿微信客户端|electron桌面聊天
一.项目概况 基于Electron+vue+electron-vue+vuex+Nodejs+vueVideoPlayer+electron-builder等技术仿制微信电脑端界面聊天室实例,实现消息 ...
- 用SignalR 2.0开发客服系统[系列2:实现聊天室]
前言 交流群:195866844 上周发表了 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 这篇文章,得到了很多帮助和鼓励,小弟在此真心的感谢大家的支持.. 这周继续系列2,实现聊天室 ...
- [Asp.net 开发系列之SignalR篇]专题三:使用SignalR实现聊天室的功能
一.引言 在前一篇文章中,我向大家介绍了如何实现实现端对端聊天的功能的,在这一篇文章中将像大家如何使用SignalR实现群聊这样的功能. 二.实现思路 要想实现群聊的功能,首先我们需要创建一个房间,然 ...
随机推荐
- Oracle不能连接故障排除[TNS-12541: TNS: 无监听程序]
1. 情况:Oracle安装后使用的好好的,放假关机后重新开机居然发现不能正常连线,客户报错:TNS-12541: TNS: 无监听程序 2. 检查: 1. 服务器上Oracle启动正 ...
- this 的指向
使用 JavaScript 开发的时候,很多开发者多多少少会被 this 的指向搞蒙圈,但是实际上,关于 this 的指向,记住最核心的一句话:哪个对象调用函数,函数里面的this指向哪个对象. 下面 ...
- 【机器学习_11】基础算法:KNN
一.概述 1.方向 2.一句话概述 3.优缺点 4.应用场景举例 二.理论 三.案例理解
- 数据分析与科学计算可视化-----用于科学计算的numpy库与可视化工具matplotlib
一.numpy库与matplotlib库的基本介绍 1.安装 (1)通过pip安装: >> pip install matplotlib 安装完成 安装matplotlib的方式和nump ...
- Shell:常用+好用命令
1.#删除15天前的数据 find /usr/local/chen/backup/ -mtime +15 -exec rm -f {} \; 2.release=`echo $name | cut - ...
- springboot学习随笔(二):简单的HelloWorld
接上章搭建好springboot环境后,开始开发入门级HelloWorld 一.构建简单的springboot项目 1.新建项目,选择Spring/Spring Starter Project 2.N ...
- eclipse启动tomcat访问http://localhost:8080 报404错误
eclipse正常启动tomcat,但是 访问http://localhost:8080 却报404错误 修改下配置 就好操作如下图 打开eclipse的server视图,双击配置好的那个tomcat ...
- group_concat_max_len
SET SESSION group_concat_max_len = 1000000; SELECT GROUP_CONCAT(a.label_number SEPARATOR ',') FROM ( ...
- codeblock 恢复默认字体设置
默认字体为:Courier New 我使用的codeblock版本为:17 .12. 今天我想调整一下codeblock的代码驱的字体,根据设置:settings->Editor->F ...
- SqlServer查询表名的备注(查询表名描述 MS_Description)
查询表名描述 MS_Description ? 1 2 3 4 5 SELECT tbs.name 表名,ds.value 描述 FROM sys.extended_properties ...