GatewayWorker
GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、游戏服务端、物联网、智能家居等等
GatewayWorker使用经典的Gateway和Worker进程模型。Gateway进程负责维持客户端连接,并转发客户端的数据给BusinessWorker进程处理,BusinessWorker进程负责处理实际的业务逻辑(默认调用Events.php处理业务),并将结果推送给对应的客户端。Gateway服务和BusinessWorker服务可以分开部署在不同的服务器上,实现分布式集群。
GatewayWorker提供非常方便的API,可以全局广播数据、可以向某个群体广播数据、也可以向某个特定客户端推送数据。配合Workerman的定时器,也可以定时推送数据。
Windows下载地址
http://www.workerman.net/down...
GatewayWorker目录
Applications/YourApp/Events.php 为业务核心处理类,聊天回复,接收信息等逻辑都在这个类中编写。
<?php
/**
* This file is part of workerman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
/**
* 用于检测业务代码死循环或者长时间阻塞等问题
* 如果发现业务卡死,可以将下面declare打开(去掉//注释),并执行php start.php reload
* 然后观察一段时间workerman.log看是否有process_timeout异常
*/
//declare(ticks=1);
use \GatewayWorker\Lib\Gateway;
/**
* 主逻辑
* 主要是处理 onConnect onMessage onClose 三个方法
* onConnect 和 onClose 如果不需要可以不用实现并删除
*/
class Events
{
/**
* 当客户端连接时触发
* 如果业务不需此回调可以删除onConnect
*
* @param int $client_id 连接id
*/
public static function onConnect($client_id)
{
// 向当前client_id发送数据
Gateway::sendToClient($client_id, "Hello $client_id\r\n");
// 向所有人发送
//Gateway::sendToAll("$client_id login\r\n");
}
/**
* 当客户端发来消息时触发
* @param int $client_id 连接id
* @param mixed $message 具体消息
*/
public static function onMessage($client_id, $message)
{
// 向所有人发送
Gateway::sendToAll("$client_id said $message\r\n");
}
/**
* 当用户断开连接时触发
* @param int $client_id 连接id
*/
public static function onClose($client_id)
{
// 向所有人发送
GateWay::sendToAll("$client_id logout\r\n");
}
}
启动WebSocket服务
启动之前,需要将start_gateway.php中的tcp改为websocket
然后点击 start_for_win.bat 启动,出现如下图所示,表示服务启动成功。
聊天页面-发送消息
<!DOCTYPE html>
<html>
<head>
<title>聊天系统</title>
<meta charset="utf-8">
<script type="text/javascript" src="../Public/jquery.js"></script>
</head>
<body>
<input type="text">
<button>发送</button>
</body>
</html>
<script type="text/javascript">
//连接WebSocket服务
var ws = new WebSocket("ws://127.0.0.1:8282");
//连接成功时触发
ws.onopen = function(evt) {
console.log('连接成功');
};
//接收到服务器发送的消息时触发
ws.onmessage = function(evt) {
console.log("Received Message: " + evt.data);
};
//连接关闭时触发
ws.onclose = function(evt) {
console.log("Connection closed.");
};
//为button添加点击事件
$('button').click(function(){
var content = $('input').val();
//向服务器发送消息
ws.send( content );
});
</script>
聊天页面-接收消息
<!DOCTYPE html>
<html>
<head>
<title>聊天系统</title>
<meta charset="utf-8">
<script type="text/javascript" src="../Public/jquery.js"></script>
</head>
<body>
</body>
</html>
<script type="text/javascript">
//连接WebSocket服务
var ws = new WebSocket("ws://127.0.0.1:8282");
//连接成功时触发
ws.onopen = function(evt) {
console.log('连接成功');
};
//接收到服务器发送的消息时触发
ws.onmessage = function(evt) {
console.log('接收到的消息: ' + evt.data);
};
//连接关闭时触发
ws.onclose = function(evt) {
console.log('连接关闭');
};
</script>
项目效果
发送消息页面:
接收消息页面:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。