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实现群聊这样的功能. 二.实现思路 要想实现群聊的功能,首先我们需要创建一个房间,然 ...
随机推荐
- 位运算练习:将整数A转换为B,需要改变多少个bit位
思路解析: 将整数A转换为B,如果A和B在第i(0<=i<32)个位上相等,则不需要改变这个BIT位,如果在第i位上不相等,则需要改变这个BIT位.所以问题转化为了A和B有多少个BIT位不 ...
- Redis的过期策略和内存淘汰策略
Redis的过期策略:通常有三种,Redis中同时使用惰性过期和定期过期两种过期策略组合. 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除.该策略可以立即清除过期的数据 ...
- Object详解(转)
Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起.作为其他所有类的基类,Object具有哪些属性和行为,是Java语言设计背后的思维体现. Object类位于ja ...
- 接口测试总结分享(http与rpc)
接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等. 一.了 ...
- layer.open参数;layer.open关闭事件;layer.open关闭刷新;layer.open获取子页的值;layer.open调用子页面的方法
父页面 function layerOpen() { layer.open({ type: 2, shade: [0], title: "验收申请", area: ['1024px ...
- 如何利用Git生成pitch和打pitch
利用Git生成和应用patch 在程序员的日常开发与合作过程中,对于code的生成patch和打patch(应用patch)成为经常需要做的事情. 什么是patch?简单来讲,patch中存储的是你 ...
- 将String类型的json字符串转换成java对象
1,import com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper mapper = new ObjectMapper(); Mycl ...
- Cent OS 6.4下安装JDK1.6
步骤1:查看Linux自带的JDK是否已安装 (卸载CentOS已安装的JDK) 安装好的CentOS会自带OpenJDK,用命令"java -version"查看,会有下面的信 ...
- 吴裕雄 python 机器学习——线性判断分析LinearDiscriminantAnalysis
import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot ...
- Linux开始结束ping命令
ctrl+c可以终止ping ctrl+z可以暂停ping,该暂停只是把进程放到后台去了,使用命令fg可以调出到前台来 通过以下命令可以设置次数: ping -c 10 (次数) ip(域名) ...