workerman 使用服务端和客户端

本文介绍了如何在PHP中使用Workerman框架创建WebSocket服务端,处理连接、消息传递和断开连接事件,以及客户端连接示例和前端交互的HTML/JavaScript实现。
摘要由CSDN通过智能技术生成

服务端安装

composer require workerman/workerman

客户端安装

composer require textalk/websocket

<?php

namespace App\Controllers;
use Workerman\Worker;
use Workerman\Lib\Timer;
use WebSocket\Client;
class Workerman extends BaseController
{
     protected $uidConnections = [];
    protected $HEARTBEAT_TIME = '60';
    public $code_arr = [
        '100' => ['code'=>100, 'msg'=>'连接成功'],
        '101' => ['code'=>101, 'msg'=>'登录成功'],
        '102' => ['code'=>102, 'msg'=>'发送数据'],
        '103' => ['code'=>103, 'msg'=>'接收成功'],
        '131' => ['code'=>131, 'msg'=>'发送失败'],
        ];
    protected $worker = null;
    public $count = 0;

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'workerman:websocket';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * 
     * @var string
     */
    protected $redis = '';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    // public function __construct()
    // {
    //     parent::__construct();
    // }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $this->start();
    }

    public function start()
    {
          $this->worker = new Worker('websocket://0.0.0.0:1818');

          $this->onConnect();
          $this->onMessage();
          $this->onClose();
          $this->redis = $this->redisdb();
        

          Worker::runAll();
    }

    public function onConnect() {
        $this->worker->onConnect = function($connection) {
            $connection->send(json_encode($this->code_arr['100']));
            $this->count++;
            $msg = "新的连接 目前连接数 {$this->count}";
            var_dump($msg);
            log_message('error',$msg);

        };
    }

    public function onMessage() {
        $this->worker->onMessage = function ($connection, $data){
            $connection->lastMessageTime = time();  //更新上一次会话时间
            //客户端心跳 直接返回
            if ($data == "") {
                return;
            }
            $data = json_decode($data, true);
            if (empty($data['uid'])) {
                $connection->close();
                return;
            }
            $uid = $data['uid'];//这里的uid根据自己的情况去验证
            switch ($data['type']) {
                case 'login':
                    // 保存该用户的输送数据
                    $connection->uid = $uid;
                    $this->uidConnections[$uid] = $connection;
                    $msg = "uid:{$uid} 登录成功 目前登录数".count($this->uidConnections);
                    $r = $this->redis->get('ddd:'.$uid);
                    if($r){
                         $this->redis->delete('ddd:'.$uid);
                    }
                    log_message('error',$r.'---');
                    // var_dump($msg);
                    log_message('error',$msg);
                    $connection->send(json_encode(['sss'=>$r]));
                    break;
                case 'send':
                    // 发送消息
                    $res = $this->sendMessageByUid($uid, $data['info']);
                    $msg = "发送成功";
                    if (!$res) {
                        $msg = "发送失败";
                    }
                    // var_dump($msg);
                    log_message('error',$msg);
                    break;
                case 'message':
                    break;
            }
        };
    }

    // 针对uid推送数据
    public function sendMessageByUid($uid, $message)
    {
        if(isset($this->uidConnections[$uid]))
        {
            $send_data = $this->code_arr['102'];
            $send_data['info'] = $message;
            $this->uidConnections[$uid]->send(json_encode($send_data));
            return true;
        }
        return false;
    }

     public function onClose() {
        $this->worker->onClose = function ($connection){
            $this->count--;
            if(isset($connection->uid)) {
                $msg = "uid:{$connection->uid} 已断开";
                var_dump($msg);
            log_message('error',$msg);
                // Log::write("$msg", 'WorkerManServer');
                // 连接断开时删除映射 和 二维码图片
                unset($this->uidConnections[$connection->uid]);
                (new OtherService())->delLoginQrCode($connection->uid);
            }
            $msg = "连接已断开 目前连接数 {$this->count}";
            var_dump($msg);
            log_message('error',$msg);
        };
     }
     public function redisdb($db=0)
     {
         $redis=new \redis();
         $redis->connect("127.0.0.1","6379");
         $redis->select($db);
         return $redis;
     }
     public function test($value='')
     {
          $data = array(
               'uid' => 1,
               'type' => 'send',
               'info' => ['sss'=>11]
          );
          $json = json_encode($data);
          $client = new Client("ws://127.0.0.1:1818");
          $client->send($json);
          $message = $client->receive();
          log_message('error',$message);
          $client->close();
     }

}
?>

服务端执行

Workerman/handle;方法

客户端请求链接

Workerman/test

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div style="margin: 0 auto;width: 800px">
    <h2>聊天室</h2>
    <textarea type="text" style="border: 1px solid black;width: 800px;height: 200px;" id="his"></textarea>
    <input type="text" style="width:740px" id="sendMsg">&nbsp;<button id="send">发送</button>
</div>
</body>
</html>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
 
    $(function () {
        var ws = new WebSocket("ws://127.0.0.1:1818");

       $('#send').click(function () {
           msg = $('#sendMsg').val();
           $('#sendMsg').val('');
           ws.send(msg);
       });
        ws.onopen = function() {
            $('#his').append("服务器连接成功.....");
            $('#his').append("\n");
        };
        ws.onmessage = function(e) {
            $('#his').append(e.data);
            $('#his').append("\n");
        };
 
    });
</script>

https的看这个:

workerman 使用服务端和客户端 SSL证书版-CSDN博客

### 回答1: 使用websocket写服务端代码,需要用到以下几个步骤:1. 创建websocket实例,用来连接服务端客户端;2. 添加服务端的回调函数,当客户端发送消息时,服务端就会收到消息;3. 向客户端发送消息;4. 关闭websocket连接。使用websocket写客户端代码,需要用到以下几个步骤:1. 创建websocket实例,用来连接服务端客户端;2. 添加客户端的回调函数,当服务端发送消息时,客户端就会收到消息;3. 向服务端发送消息;4. 关闭websocket连接。 ### 回答2: 使用WebSocket编写服务端客户端代码是一种实现实时双向通信的方式。以下是一个简单的示例: 服务端代码: ```python import asyncio import websockets async def handle(websocket, path): while True: message = await websocket.recv() print(f"Received message: {message}") await websocket.send(f"Server received: {message}") async def start_server(): server = await websockets.serve(handle, "localhost", 8000) print("Server started on ws://localhost:8000") await server.wait_closed() asyncio.run(start_server()) ``` 客户端代码: ```python import asyncio import websockets async def send_message(message): async with websockets.connect("ws://localhost:8000") as websocket: await websocket.send(message) response = await websocket.recv() print(f"Received response: {response}") asyncio.run(send_message("Hello server!")) ``` 在服务端代码中,我们使用`websockets`模块创建一个WebSocket服务器,并定义了一个`handle`函数来处理接收到的消息。该函数通过`await websocket.recv()`接收客户端发送的消息,并使用`await websocket.send()`向客户端发送响应消息。 在客户端代码中,我们使用`websockets`模块创建一个WebSocket连接,并使用`await websocket.send()`向服务端发送消息。使用`await websocket.recv()`接收服务端的响应消息,并输出到控制台。 以上是一个简单的WebSocket服务端客户端代码示例,可以通过运行这两个代码来实现双向通信。 ### 回答3: 使用WebSocket编写服务端客户端代码如下: 服务端代码: ``` import asyncio import websockets # 定义WebSocket服务器的处理逻辑 async def server_handler(websocket, path): # 接收客户端的消息 while True: message = await websocket.recv() print(f"收到消息:{message}") # 发送消息给客户端 response = f"已收到你的消息:{message}" await websocket.send(response) # 启动WebSocket服务器 start_server = websockets.serve(server_handler, 'localhost', 8000) # 开始事件循环 asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever() ``` 客户端代码: ``` import asyncio import websockets # 定义WebSocket客户端的处理逻辑 async def client_handler(): async with websockets.connect('ws://localhost:8000') as websocket: # 发送消息给服务端 message = input("请输入消息:") await websocket.send(message) print(f"发送消息:{message}") # 接收服务端的消息 response = await websocket.recv() print(f"收到服务端的响应:{response}") # 执行WebSocket客户端逻辑 asyncio.get_event_loop().run_until_complete(client_handler()) ``` 以上是一个简单的WebSocket服务端客户端代码示例。服务端使用`websockets`库创建一个WebSocket服务器,通过定义`server_handler()`函数来处理来自客户端的消息,并将响应返回给客户端客户端使用`websockets`库建立与服务端的连接,通过定义`client_handler()`函数来向服务端发送消息,并接收服务端的响应。请注意,服务端客户端的代码分别运行在不同的程序中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值