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

本文介绍如何使用PHP的Swoole库实现一个简单的实时聊天应用,包括服务端和客户端代码示例。通过Swoole的事件循环机制,可以轻松处理多个客户端之间的消息广播。

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

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();
?>

客户端代码

<?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、首先执行服务端: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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值