总结GatewayWorker学习

本文介绍了如何使用GatewayWorker框架搭建WebSocket服务并与真实用户ID绑定的过程。包括环境搭建、关键文件配置及客户端交互实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

就在几天前,本人突然发觉自己能力有待提高,于是乎就花钱买了几节课学习了一下workerman中的GatewayWorker框架。

现总结如下:

    入门:首先查看了workerman的官网https://www.workerman.net/ 上面有workerman、GatewayWorker的手册和下载地址,了解了一下workerman作为websocket的简单解释,之后便下载了GatewayWorker使用tp5框架开始测试开发。

    本人开发环境wamp,项目总目录chat,配置好项目可以正常访问以后,首先将下载解压后的GatewayWorker文件放在chat/vendor目录下,首先修改了GatewayWorker/Applications/YourApp目录下的start_gateway.php文件,将

$gateway = new Gateway("tcp://0.0.0.0:8282");

修改为

$gateway = new Gateway("websocket://0.0.0.0:8282");

修改完以后,本人是在windows下开发所以打开GatewayWorker目录,点击start_for_win.bat就可以启动socket服务,服务启动以后并可以通过socket通信啦。

其中GatewayWorker中主要用到的文件是GatewayWorker/Application/YourApp目录下的Events.php文件,里面包含三个主要处理的方法,可以看一下注释,一个是连接方法onConnect,初始化客户端时首先要经过的就是该方法,这里可以做的功能有统计客户端数量、将socket服务给客户端自定义的client_id发送到客户端,以便进行客户端自定义id与我们自己的用户id进行绑定 ,这个可以稍后再说。第二个就是接受客户端发送的消息方法onMessage,客户端发送的消息都到达onMessage方法,然后在发送给指定的用户或客户端,客户端发送消息时可以进行类别区分,在onMessage方法中可以根据类型处理不同的逻辑。第三个断开连接时触发的方法onClose,学习中只是简单的介绍了一下该方法,并未真正时候,之后可以根据自己的业务需求做调整。

以上就是GatewayWorker里面我们主要操作的方法,切记:每次变更Event.php文件都要关闭socket服务重新启动,而且建议大家Event.php中只做通信功能,其他的逻辑处理不要在该文件里处理,还有一点,客户端(本人使用的老师给的html页面做客户端),本人在学习的时候在Event.php中用到的方法有Gateway::sendToClient()发送到客户端、Gateway::bindUid()客户端id与用户id绑定以及Gateway::isUidOnline()用户是否在线、Gateway::sendToUid()发送给指定用户等等。

接下来从客户端正式开始使用socket服务发送信息和接收信息,首先在页面引入jq文件,然后在<script>标签内建立通信

var ws = new WebSocket("ws://127.0.0.1:8282");

其中127.0.0.1是本地,是你socket服务所在的服务器ip,同上面启动的服务所在服务器ip相同,端口相同才可以连接服务成功,之后接收消息使用

ws.onmessage = function(e){

    console.log(e);

}

所有接收到客户端的消息都在上面方法中处理。

发送消息的方法是

ws.send(data);

data是发送的数据,这里需要注意一点,客户端发送的消息、Event.php中onMessage方法接收以后又发出的消息、以及客户端onmessage数据都要统一为json格式,接收到的数据是json格式,发送数据也要是json格式,下面一步一步开始开发:


1、首先将socket服务默认给客户端的id与真实用户绑定

启动页面是首先经过Event.php的onConnect()方法,但目前只知道client_id,所以把client_id发送到客户端

public static function onConnect($client_id)
{
    global $num;
    // 向当前client_id发送数据 
    //Gateway::sendToClient($client_id, "Hello $client_id\r\n");
    // 向所有人发送
    //Gateway::sendToAll("$client_id login\r\n");
    echo "connect".++$num.":".$client_id."\n";

    //在此绑定uid  但是这里没有uid  因此发送一个消息
    Gateway::sendToClient($client_id,json_encode([
        "type"=> "init",
        "client_id" => $client_id
    ]));
}

2、html聊天页面(该页面一般可以通过控制器获取到当前接收用户id即fromid和要发送给对方的用户id即toid)

接收到启动时上面发送过来的信息,将当前用户发送到Event.php中

var from_id = {$from_id};
var to_id = {$to_id};
var ws = new WebSocket("ws://127.0.0.1:8282");
ws.onmessage = function (e) {
    var message = eval("("+e.data+")");
    switch (message.type){
    case "init":
      var data = '{"type":"bind","from_id":"'+from_id+'"}';
     ws.send(data);
    return;
}
    console.log(message);
}


3、Event.php中onMessage()方法接收客户端发送的消息,并进行绑定

public static function onMessage($client_id, $message)
{
     $data = json_decode($message,true);
     if(!$data){
         return;
     }
     switch ($data['type']){
         case "bind":
             Gateway::bindUid($client_id,$data['from_id']);
             return;
     }
}
以上三步就将socket服务与我们真实的用户id进行绑定,一个真实用户可以绑定多个客户端id

好累,明天在更吧~

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值