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目录

QQ截图20200315194910.png

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

QQ截图20200315195637.png

然后点击 start_for_win.bat 启动,出现如下图所示,表示服务启动成功。

QQ截图20200315195420.png

聊天页面-发送消息

<!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>

项目效果

发送消息页面:

QQ截图20200315195833.png

接收消息页面:

QQ截图20200315200101.png


如若时光萧瑟去丶
111 声望9 粉丝

weakChickenPeng.