当前位置:   article > 正文

php使用 Swoole - event-loop循环线程实现多个客户端聊天示例代码_swoole 循环发送信息

swoole 循环发送信息

php使用 Swoole - event-loop循环线程实现多个客户端聊天示例代码

服务端代码

 <?php

// Server
class Server
{
    private $serv;

    public function __construct()
    {
        $this->serv = new swoole_server("0.0.0.0", 9501);
        $this->serv->set(array(
            'worker_num' => 8,
            'daemonize' => false,
            'max_request' => 10000,
            'dispatch_mode' => 2,
            'debug_mode' => 1
        ));

        $this->serv->on('Start', array($this, 'onStart'));
        $this->serv->on('Connect', array($this, 'onConnect'));
        $this->serv->on('Receive', array($this, 'onReceive'));
        $this->serv->on('Close', array($this, 'onClose'));

        $this->serv->start();
    }

    public function onStart($serv)
    {
        echo "Start\n";
    }

    public function onConnect($serv, $fd, $from_id)
    {
        //打印一下连接的客户端
        echo "Client {$fd} connect \n";
    }

    //接收到客户端的内容,并发送内容给客户端
    public function onReceive(swoole_server $serv, $fd, $from_id, $data)
    {
        echo "Get Message From Client {$fd}:{$data}\n";
        //建立一个广播
        foreach ($serv->connections as $client) {
            //当客户端不相等时,就将fd客户端的内容发送消息给其他客户端
            if ($fd != $client) {
                $serv->send($client, $data);
            }
        }
    }

    public function onClose($serv, $fd, $from_id)
    {
        echo "Client {$fd} close connection\n";
    }
}

// 启动服务器
$server = new Server();
?>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

客户端代码

<?php

//建立swoole连接
$socket = stream_socket_client("tcp://127.0.0.1:9501", $errno, $errstr, 30);

//读监听函数
function onRead()
{
    global $socket;
    //接收到客户端描述符中的内容
    $buffer = stream_socket_recvfrom($socket, 1024);
    if (!$buffer) {
        echo "Server Closed\n";
        swoole_event_del($socket);
    }
    echo "\nRecv:{$buffer}\n";
    fwrite(STDOUT, "请输入聊天信息:");
}


//打印方法
function onWrite()
{
    global $socket;
    echo "on Write\n";
}

//监听来自键盘的输入 函数
function onInput()
{
    global $socket;
    $msg = trim(fgets(STDIN));
    //如果输入exit,表示退出
    if ($msg == "exit") {
        swoole_event_exit();
        exit();
    }
    //发送给客户端指定文字
    swoole_event_write($socket, $msg);
    fwrite(STDOUT, "请输入聊天信息:");
}

swoole_event_add($socket, 'onRead', 'onWrite');

//监听 标准输入的内容
swoole_event_add(STDIN, 'onInput');


?>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

执行步骤

1、首先执行服务端:php server.php
2、其次执行客户端:php client.php ,此步骤需要在两个窗口中执行,便于区别,执行两次后,会看到服务端打印出两个链接的字样
在这里插入图片描述3、在客户端1中,输入:qipa250
我们会在服务端看到,Get Message From Client 1:qipa250

在这里插入图片描述在客户端2中可以看到:
在这里插入图片描述
我们在客户端2中,输入:qipatiandi
看到服务端返回:Get Message From Client 2:qipatiandi
在这里插入图片描述在客户端1中可以看到,接收到了消息:RECV:qipatiandi
在这里插入图片描述我们在客户端1中,同时输入两条消息,如下
请输入聊天信息:www.qipa250.com
请输入聊天信息:www.qipa250.com

服务端就能收到两条消息,并推送给了客户端2,
在这里插入图片描述客户端2收到了来自客户端1的消息:RECV:www.qipa250.com
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/40848
推荐阅读
相关标签
  

闽ICP备14008679号