zoukankan      html  css  js  c++  java
  • swoole学习第一天,SWOOLE_SOCK_TCP/UDP

    前面源码安装完成,现在进入学习时间,顺便做一些笔记

    //创建server端代码

    https://wiki.swoole.com/wiki/page/14.html

    <?php
    //创建对象
    $server = new Swoole_server('0.0.0.0',9501);
    
    $server->set(array(
        'worker_num' => 2, //设置启动的Worker进程数量。Swoole采用固定Worker进程的模式。
        'max_request' => 100 //此参数表示worker进程在处理完n次请求后结束运行。manager会重新创建一个worker进程。此选项用来防止worker进程内存溢出。
    ));
    
    //监听连接进入事件
    /**
     * $fd 表示客户端链接server的唯一标识,自增的形式
     * $reactor_id  线程标识
     */
    $server->on('Connect', function ($server, $fd, $reactor_id){
        echo "Connect:{$fd} - {$reactor_id} success
    ";
    });
    
    //监听链接接收事件
    $server->on('receive', function ($server, $fd, $from_id, $data){
        //send给客户端发送数据 $fd 客户端唯一标识
        //$from_id  线程ID
        $server->send($fd, "Server:{$fd} - {$from_id} - {$data}
    ");
        echo 'get '.$fd .':'.$data."
    ";
    });
    
    //关闭监听事件
    $server->on('Close', function ($server, $fd){
        echo "Close {$fd}
    
    ";
    });
    
    $server->start();

    验证是否可用方法有多种

    第一种:命令形式

    root@VM-0-16-ubuntu:/data/www# telnet 127.0.0.1 9501
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    123
    Server:4 - 0 - 123

     服务端输出打印对应的输出

    Connect:4 - 0 success
    get 4:123

    第二种方法,使用swoole client 服务

    https://wiki.swoole.com/wiki/page/29.html

    //创建对象
    $client = new Swoole_client(SWOOLE_SOCK_TCP);
    
    //判断是否连接成功,返回bool值
    if (!$client->connect('127.0.0.1', 9501)){ echo "Connect error "; exit; }; //PHP cli常量 fwrite(STDOUT,'请输入:'); $msg = trim(fgets(STDIN)); //发送消息给服务器 ,判断是否发送成功 返回 bool值 if (!$client->send($msg)){ echo "send error "; }; //接收服务器发送的数据 $res = $client->recv(); echo $res . " ";

    肯能还有别的方法来验证,才疏学浅只能用这两种方式

    最后,查看server的set设置是否生效可以使用ps命令查看,如修改需要重启服务端server

    root@VM-0-16-ubuntu:/data/www# ps -aft | grep tcp_server.php
    13059 pts/3    S+     0:00  \_ grep --color=auto tcp_server.php
    12828 pts/2    Sl+    0:00                  \_ /usr/local/php/bin/php tcp_server.php
    12829 pts/2    S+     0:00                      \_ /usr/local/php/bin/php tcp_server.php
    12831 pts/2    S+     0:00                          \_ /usr/local/php/bin/php tcp_server.php
    12832 pts/2    S+     0:00                          \_ /usr/local/php/bin/php tcp_server.php

    ------------------------------

    SEOOLE UDP

    http://wiki.swoole.com/wiki/page/477.html

    swoole的udp和tcp区别还是很大的。

    UDP服务器与TCP服务器不同,UDP没有连接的概念。启动Server后,客户端无需Connect,直接可以向Server监听的9502端口发送数据包。对应的事件为onPacke。
    <?php
    
    //采用UDP方式SWOOLE_SOCK_UDP
    //UDP服务器与TCP服务器不同,UDP没有连接的概念。启动Server后,客户端无需Connect,直接可以向Server监听的9502端口发送数据包。对应的事件为onPacke
    $server = new Swoole_server('0.0.0.0', 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
    
    $server->set(array(
        'worker_num' => 2,
        'max_request' => 100,
    ));
    
    /**
     * $data Client发送的数据
     * $clientInfo Client信息
     * UDP fd的概念。
     */
    
    $server->on('Packet', function ($server, $data, $clientInfo){
        //这里注意tcp这里使用的是send,而UDP使用的是sendto
        //向任意的客户端IP:PORT发送UDP数据包。
        $server->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data);
        var_dump($clientInfo);
    });
    
    $server->start();

    server启动之后,会启动一个进程,默认不是4个,就一个主进程,来处理数据。

    //'task_worker_num' => 4, //业务请求量很大,一个worker 肯定是不够的,我们利用多个task worker的方式来改写下server。
    root@VM-0-16-ubuntu:/data/www# ps -aft | grep udp_server.php 
    19316 pts/3    S+     0:00  \_ grep --color=auto udp_server.php
    19304 pts/2    Sl+    0:00                  \_ /usr/local/php/bin/php udp_server.php
    19305 pts/2    S+     0:00                      \_ /usr/local/php/bin/php udp_server.php
    19312 pts/2    S+     0:00                          \_ /usr/local/php/bin/php udp_server.php

    Clinet端代码

    <?php
    
    $client = new Swoole_client(SWOOLE_SOCK_UDP);
    $client->connect('127.0.0.1', 9502);
    
    //PHP cli常量
    fwrite(STDOUT,'请输入:');
    $msg = trim(fgets(STDIN));
    
    //发送消息给服务器
    if (!$client->send($msg)){
        echo "send error
    ";
    };
    
    //接收服务器发送的数据
    $res = $client->recv();
    
    echo $res . "
    ";
  • 相关阅读:
    rollup vs webpack
    2019年8月 移动端问题
    2019年7月
    数字和文字 css对齐设置
    uniapp微信分享功能
    css 美化原生的table样式
    本地创建mongodb服务(安装mongodb、创建数据库和密码、创建用户和密码、本地配置连接测试)
    JS-向当前url追加参数
    自定义博客园样式一(使用darkgreentrip)皮肤
    vue报错-Object(...) is not a function
  • 原文地址:https://www.cnblogs.com/caoql/p/11654958.html
Copyright © 2011-2022 走看看