Swoole-網絡通信引擎TCP

Server端

介紹

可以查看代碼的註釋

面向過程實現

<?php
/**
 * User: sHuXnHs <[email protected]>
 * Date: 19-7-12
 * Time: 12:34
 */

//創建Server對象,監聽 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);

//
$serv->set([
    'worker_num' => '8',        // worker進程數
    'max_conn' => '1000',       // 最大連接數
    'daemonize' => '1',         // 開啓轉入後臺守護進程運行
    'reactor_num' => '8',       // 線程數量
    'max_request' => '1000',    // 最大請求數,表示worker進程在處理n次請求後結束運行,設置爲0表示不自動重啓
    'log_file' => '/var/log/swoole.log',    // 指定swoole錯誤日誌文件ao
    'heartbeat_check_interval' => 30 ,      //  每隔多少秒檢測一次,swoole會輪詢所有TCP請求,超過心跳時間關閉,單位秒
    'heartbeat_idle_time' => 60             // TCP連接最大閒置時間,單位秒
]);

//監聽連接進入事件
$serv->on('connect', function ($serv, $fd) {
    echo "Client:".$fd." Connect.\n";
});

//監聽數據接收事件
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
    $serv->send($fd, "Server: ".$data);
});

//監聽連接關閉事件
$serv->on('close', function ($serv, $fd) {
    echo "Client: Close.\n";
});

//啓動服務器
$serv->start();

面向對象實現

<?php
/**
 * User: sHuXnHs <[email protected]>
 * Date: 19-7-9
 * Time: 11:47
 */
class TCP{

    private $sock_type = SWOOLE_SOCK_TCP;

    protected $config = [
        'worker_num' => '8',        // worker進程數
        'max_conn' => '1000',       // 最大連接數
        'daemonize' => '1',         // 開啓轉入後臺守護進程運行
        'reactor_num' => '8',       // 線程數量
        'max_request' => '1000',    // 最大請求數,表示worker進程在處理n次請求後結束運行,設置爲0表示不自動重啓
        'log_file' => '/var/log/swoole.log',    // 指定swoole錯誤日誌文件ao
        'heartbeat_check_interval' => 30 ,      //  每隔多少秒檢測一次,swoole會輪詢所有TCP請求,超過心跳時間關閉,單位秒
        'heartbeat_idle_time' => 60             // TCP連接最大閒置時間,單位秒
    ];

    public $serv = null;

    /**
     * TCP constructor.
     * @param string    $host host
     * @param int       $port port
     * @param int       $mode 默認爲多線程模式,還有SWOOLE_BASE基本模式
     */
    public function __construct($host = '127.0.0.1', $port = 9501, $mode = SWOOLE_PROCESS)
    {
        $this->serv = new swoole_server($host, $port, $mode, $this->sock_type);

        // 設置運行的各項參數
        $this->serv->set($this->config);

        $this->serv->on("connect", [$this, 'onConnect']);

        $this->serv->on("receive", [$this, 'onReceive']);

        $this->serv->on("close", [$this, 'onClose']);

        // 開啓事件
        $this->serv->start();

    }

    /**
     * @function                    監聽連接進入事件
     * @param   object  $serv       server對象
     * @param   int     $fd         客戶端唯一標示
     * @param   int     $reactor_id 線程id
     */
    public function onConnect($serv, $fd, $reactor_id){
        echo "Cilent: ".$fd."-thread".$reactor_id."-connect".PHP_EOL;

    }

    /**
     * @function    監聽事件接受數據
     * @param $serv
     * @param $fd
     * @param $from_id
     * @param $data
     */
    public function onReceive($serv, $fd, $from_id, $data){
        $serv->send($fd,  "server:".$data);
    }

    /**
     * @function    監聽連接關閉事件
     * @param $serv
     * @param $fd
     */
    public function onClose($serv, $fd){
        echo "Cilent".$fd."close".PHP_EOL;
    }
}
$serv = new TCP();

Client端

面向對象式寫法

同樣查看代碼的註釋,默認使用127.0.0.1:9501,socket類型爲SWOOLE_SOCK_TCP

<?php
/**
 * 客戶端
 * User: sHuXnHs <[email protected]>
 * Date: 19-7-12
 * Time: 16:47
 */
class  Client{

    public $client = null;

    public $config = [];

    /**
     * Client constructor.
     * @param string    $host           host
     * @param int       $port           port
     * @param int       $sock_type      socket的類型,默認TCP,也可以UDP:SWOOLE_SOCK_UDP
     * @param int       $is_async       默認同步阻塞,也可以指定爲SWOOLE_SOCK_ASYNC異步非阻塞或SWOOLE_SOCK_SYNC同步阻塞
     * @param bool      $is_keep        是否創建長連接
     */
    public function __construct($host = '127.0.0.1', $port = 9501, $sock_type = SWOOLE_SOCK_TCP,
                                $is_async = SWOOLE_SOCK_ASYNC, $is_keep = false)
    {
        if($is_keep){
            $this->client = new Swoole\Client($sock_type | SWOOLE_KEEP, $is_async);
        }else{
            $this->client = new Swoole\Client($sock_type, $is_async);
        }

        // 設置運行的各項參數
        $this->client->set($this->config);

        // 註冊異步事件回調函數
        $this->client->on("connect", [$this, 'onConnect']);

        $this->client->on("receive", [$this, 'onReceive']);

        $this->client->on("error", [$this, 'onError']);

        $this->client->on("close", [$this, 'onClose']);

        // 開啓事件
        $this->client->connect($host, $port);

    }

    /**
     * @function                    監聽連接進入事件
     * @param   object  $cli        client對象
     */
    public function onConnect($cli){
        fwrite(STDOUT, "input data to server");
        $data = trim(fgets(STDIN));
        $cli->send($data);
    }


    /**
     * @function    監聽事件接受數據
     * @param   object  $cli    client對象
     * @param   string  $data   接收到的數據
     */
    public function onReceive($cli, $data){
        echo "Receive data: ".$data.PHP_EOL;
    }


    /**
     * @function    監聽連接關閉事件
     * @param   object  $cli        client對象
     */
    public function onClose($cli){
        echo "Connection close".PHP_EOL;
    }

    /**
     * @function    監聽事件錯誤
     * @param   object  $cli    client對象
     */
    public function onError($cli){
        echo "error".$cli->errCode.PHP_EOL;
    }

}
$client = new Client("127.0.0.1","9502", SWOOLE_SOCK_UDP);

面向過程式寫法

<?php
/**
 * 同步阻塞客戶端,php-fpm環境下
 * User: sHuXnHs <[email protected]>
 * Date: 19-7-12
 * Time: 16:47
 */

$cilent = new swoole_client(SWOOLE_SOCK_TCP);

try{
    $cilent->connect("127.0.0.1",9501,-1);
}catch (Exception $e){
    echo $e->getMessage().PHP_EOL;
    exit("connect failed. Error: {$cilent->errCode}".PHP_EOL);
}

fwrite(STDOUT, "請輸入");
$msg = trim(fgets(STDIN));
// 發送消息
$cilent->send($msg);

// 接收數據
$result = $cilent->recv();
echo $result.PHP_EOL;
$cilent->close();
<?php
/**
 * 異步非阻塞客戶端,只能在Cli命令行環境下運行
 * User: sHuXnHs <[email protected]>
 * Date: 19-7-12
 * Time: 16:47
 */

$client = new Swoole\Client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
$client->on("connect", function(swoole_client $cli) {
    fwrite(STDOUT, "請輸入");
    $msg = trim(fgets(STDIN));
    $cli->send($msg);
});
$client->on("receive", function(swoole_client $cli, $data){
    echo "Receive: $data";
});
$client->on("error", function(swoole_client $cli){
    echo "error".PHP_EOL;
});
$client->on("close", function(swoole_client $cli){
    echo "Connection close".PHP_EOL;
});
$client->connect('127.0.0.1', 9501);

簡單跑一下測試一下

測試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章