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实现群聊这样的功能. 二.实现思路 要想实现群聊的功能,首先我们需要创建一个房间,然 ...
随机推荐
- jquery中对小数进行取整
var uu=Math.floor(5.36) 向下取整 结果为5 var uu=Math.floor(5.88) 结果为5 Math.ceil(5.33) 向上取整,结果为6 Math.round( ...
- Cache-control使用Cache-control:private学习笔记【转载】
网页缓存由 HTTP消息头中的Cache-control控制,常见取值有private.no-cache.max-age.must- revalidate等,默认为private 其作用根据不同的重新 ...
- springboot+VUE(二)
入element-ui cnpm install element-ui -S 执行后,会下载element-ui的包到本地,同时会将配置加入到package.json的依赖块中. 通过命令行可以将最新 ...
- 72.纯 CSS 创作气泡填色的按钮特效
原文地址:https://segmentfault.com/a/1190000015560736 感想:过渡效果+xyz中一轴. HTML code: <nav> <ul> & ...
- C#解析json和xml数据
C#解析json和xml数据 // 用到的包using Newtonsoft.Json; // using Newtonsoft.Json.Linq; const string value = &qu ...
- Mac 端配置 Lua 环境
一.设计目的 Lua 是一种轻量级的脚本语言,其目的是为了嵌入到程序中,从而为程序提供灵活的扩展和定制功能. 二.特性 轻量级:编译后仅仅 100 余K,可以很方便的嵌入到程序中. 可扩展:Lua 提 ...
- 彻底搞懂Scrapy的中间件(二)
在上一篇文章中介绍了下载器中间件的一些简单应用,现在再来通过案例说说如何使用下载器中间件集成Selenium.重试和处理请求异常. 在中间件中集成Selenium 对于一些很麻烦的异步加载页面,手动寻 ...
- mysql脚本转h2
注意事项:转的时候需要 脚本中不能包含utf8mb4格式
- 整合MVC实现文件上传
1.整合MVC实现文件上传整合MVC实现文件上传在实际的开发中在实现文件上传的同时肯定还有其他信息需要保存到数据库,文件上传完毕之后需要将提交的基本信息插入数据库,那么我们来实现这个操作.整个MVC实 ...
- python并发编程基础之守护进程、队列、锁
并发编程2 1.守护进程 什么是守护进程? 表示进程A守护进程B,当被守护进程B结束后,进程A也就结束. from multiprocessing import Process import time ...