// 标记是全局启动
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创建聊天室实例的更多相关文章

  1. SignalR 聊天室实例详解(服务器端推送版)

    翻译自:http://www.codeproject.com/Articles/562023/Asp-Net-SignalR-Chat-Room  (在这里可以下载到实例的源码) Asp.Net Si ...

  2. laravel整合workerman做聊天室

    测试工具  http://www.blue-zero.com/WebSocket/ 2018年8月6日17:28:24 <?php namespace App\Console\Commands; ...

  3. Java NIO 聊天室实例

    最近写了个Java NIO聊天室聊天的程序,NIO学习起来比较困难的,我的代码能给大家起到一个抛砖引玉的作用! 服务端: package test.javanio; /** * @author * @ ...

  4. workerman搭建聊天室

    首先,先打开官网手册   http://doc.workerman.net/ 根据手册里安装里的提示,完成环境检测,和安装对应的扩展,并把对应的WorkerMan代码包下载解压至根目录 在根目录下创建 ...

  5. 使用signalR创建聊天室。

    浏览器支持Html5的情况下,SignalR使用WebSockets,当不支持时SignalR将使用其它技术来实现通讯. 界面如下:左侧包含三种聊天对象,不同的聊天对象会创建不同的对话框. 设计思路参 ...

  6. 史上最全面的SignalR系列教程-6、SignalR 实现聊天室

    1.概述 通过前面几篇文章对SignalR的详细介绍.我们知道Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long po ...

  7. electron聊天室|vue+electron-vue仿微信客户端|electron桌面聊天

    一.项目概况 基于Electron+vue+electron-vue+vuex+Nodejs+vueVideoPlayer+electron-builder等技术仿制微信电脑端界面聊天室实例,实现消息 ...

  8. 用SignalR 2.0开发客服系统[系列2:实现聊天室]

    前言 交流群:195866844 上周发表了 用SignalR 2.0开发客服系统[系列1:实现群发通讯] 这篇文章,得到了很多帮助和鼓励,小弟在此真心的感谢大家的支持.. 这周继续系列2,实现聊天室 ...

  9. [Asp.net 开发系列之SignalR篇]专题三:使用SignalR实现聊天室的功能

    一.引言 在前一篇文章中,我向大家介绍了如何实现实现端对端聊天的功能的,在这一篇文章中将像大家如何使用SignalR实现群聊这样的功能. 二.实现思路 要想实现群聊的功能,首先我们需要创建一个房间,然 ...

随机推荐

  1. 使用QQ传输大文件

    现在在公网上能传输大文件并且稳定支持断点续传的软件非常少了,可以使用qq来做这件事. qq传输单个文件有时候提示不能超过4g有时候提示不能超过60g,没搞明白具体怎么样. 可以使用qq的传输文件夹功能 ...

  2. db powerdesign CDM、LDM、PDM、OOM的区别

        导读 在本篇文章中,你将会了解到PowerDesigner工具中的三种模型CDM,OOM,PDM的区别和联系. PowerDesigner 简称PD,是一种数据建模工具,适合于开发大型应用系统 ...

  3. 使用NPM安装Vue项目

    使用NPM安装Vue项目步骤如下: 一.先安装node.js,下载node.js安装包,node.js安装成功之后,左击电脑左下角>运行>输入cmd,如下图所示: 二.点击确定进入,分别在 ...

  4. Spark启动报错|java.io.FileNotFoundException: File does not exist: hdfs://hadoop101:9000/directory

    at org.apache.spark.deploy.history.FsHistoryProvider.<init>(FsHistoryProvider.scala:) at org.a ...

  5. PHP原生写的生成图片缩略图类

    PHP原生写的生成图片缩略图类,本文以京东商品图片为例,分别生成三种不同尺寸的图片.调用方法很简单只要传参数高度和宽度,及新图片的名称. 引入缩略图类 include_once 'ImageResiz ...

  6. 分布式 基本理论 CAP 之 各分布式系统的cap支持情况

    分布式系统.理论.协议 非常非常多, 它们多cap 的支持是怎么样的呢? 需要注意的是,分布式系统 为了应付各种 复杂 应用场景,支持各种各样的功能,可能有的提供了选项或某种机制, 某个时刻,支持CP ...

  7. sql day2

    -- 数据的准备 -- 创建一个数据库 create database python_test charset=utf8; -- 使用一个数据库 use python_test; -- 显示使用的当前 ...

  8. asp.net core结合docker实现自动化获取源码、部署、更新

    之前入坑dotnet core,由于一开始就遇到在windows上编译发布的web无法直接放到centos上执行.之后便直接研究docker,实现在容器中编译发布.然后就越玩越大,后来利用git的ho ...

  9. 新装 Win7 系统装完驱动精灵,一打开到检测界面就卡死——原因与解决方案

    1.现象: 重装系统后,鼠标反应慢,且不能上网.因此装了个驱动精灵,准备更新下驱动,但驱动精灵一打开到检测界面就卡死(换驱动人生.鲁大师也一样). 2.原因: Win7 系统 iso 中自带的驱动程序 ...

  10. JeeWx全新版本发布!捷微二代微信活动平台1.0发布!活动插件持续开源更新!

    JeeWx捷微二代微信活动平台 (专业微信营销活动平台,活动插件持续更新ing~)    终于等到你!还好我没放弃! 在团队持续多年的努力下,Jeewx微信管家和H5活动平台不断更新迭代,积累了许许多 ...