• Swoole 中 TCP、UDP 和长连接、短连接


    TCP 服务

    swoole 文档 - TCP 服务

    tcp 服务端

    <?php
    // 1. 创建 swoole 默认创建的是一个同步的阻塞tcp服务
    $host = "0.0.0.0"; // 0.0.0.0 代表接听所有
    // 默认是tcp
    $serv = new SwooleServer($host, 9000);
    // 添加配置
    $serv->set([
      'heartbeat_idle_time' => 10,
      'heartbeat_check_interval' => 3,
    ]);
    // 2. 注册事件
    $serv->on('Start', function($serv) use($host){
        echo "启动 swoole 监听的信息tcp:$host:9000
    ";
    });
    
    //监听连接进入事件
    $serv->on('Connect', function ($serv, $fd) {
        echo "Client: 连接成功.
    ";
    });
    
    //监听数据接收事件
    $serv->on('Receive', function ($serv, $fd, $from_id, $data) {
        $serv->send($fd, "Server: ".$data);
    });
    
    //监听连接关闭事件
    $serv->on('Close', function ($serv, $fd) {
        echo "断开连接.
    ";
    });
    // 3. 启动服务器
    // 阻塞
    $serv->start(); // 阻塞与非阻塞
    

      

    这样就创建了一个 TCP 服务器,监听本机 9000 端口。

    然后先启动服务,然后再通过 telnet 命令去连接试试

     php swoole_tcp_server.php
     # 启动 swoole 监听的信息tcp:0.0.0.0:9000
    
     telnet 127.0.0.1 9000
    # Trying 127.0.0.1...
    # Connected to localhost.
    

      

    tcp 客户端

    <?php
    // 同步客户端
    $client = new swoole_client(SWOOLE_SOCK_TCP);
    
    //连接到服务器
    if (!$client->connect('127.0.0.1', 9000, 0.5))
    {
        die("connect failed.");
    }
    
    function order()
    {
         sleep(4);// 假设某一些操作造成时间很长
         return "order
    ";
    }
    
    //向服务器发送数据
    if (!$client->send(order()))
    {
        die("send failed.");
    }
    //从服务器接收数据
    $data = $client->recv();
    if (!$data)
    {
        die("recv failed.");
    }
    
    //关闭连接
    $client->close();
    
    // 返回结果给用户
    echo '订单生成成功'."
    ";
    

      

    运行 tcp 客户端去连接服务端,假设处理需要时间,最后就会输出订单生成成功

    php swoole_tcp_client.php
    # 订单生成成功
    

      

    UDP 服务

    swoole 文档 - UDP 服务

    udp 服务端

    <?php
    //创建Server对象,监听 127.0.0.1:9000端口,类型为SWOOLE_SOCK_UDP
    $serv = new swoole_server("0.0.0.0", 9000, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
    
    //监听数据接收事件
    $serv->on('Packet', function ($serv, $data, $clientInfo) {
        $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data);
        var_dump($clientInfo);
    });
    echo "0.0.0.0:9000
    ";
    //启动服务器
    $serv->start();
    

      

    udp 客户端

    <?php
    $client = new swoole_client(SWOOLE_SOCK_UDP);
    $client->sendTo('127.0.0.1', 9000, 'upd');
    // 接收服务端信息
    $data = $client->recv();
    var_dump($data);
    

      

    两种协议

    TCP(Transmission Control Protocol 传输控制协议):是一种面向连接的,可靠的,基于字节流的传输通信协议。

    UDP(User Datagram Protocol 用户数据报协议):是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

    UDP 服务器与 TCP 服务器不同,UDP 没有连接的概念。启动 Server 后,客户端无需 Connect,直接可以向 Server 监听的 9502 端口发送数据包。

    长连接、短连接

    • 长连接: 客户端和服务端建立连接后不进行断开,之后客户端再次访问这个服务器上的内容时,继续使用这一条连接通道。
    • 短连接: 客户端和服务端建立连接,发送完数据后立马断开连接。下次要取数据,需要再次建立连接。

    Http长连接和TCP长连接的区别

    Http长连接 和 TCP长连接的区别在于: TCP 的长连接需要自己去维护一套心跳策略。,而Http只需要在请求头加入keep-alive:true即可实现长连接。

  • 相关阅读:
    UNIX网络编程--简介(一)【转】
    linux网络编程--网络编程的基本函数介绍与使用【转】
    微内核VS宏内核【转】
    Linux内核同步机制--自旋锁【转】
    多线程中的信号机制--signwait()函数【转】
    线程同步--递归锁和非递归锁【转】
    linux中线程池【转】
    多进程多线程优先级理解--优先级反转【转】
    【转】如何检测wifi信号强度? -- 不错
    【转】安卓手机有安全模式?安卓4.1安全模式介绍
  • 原文地址:https://www.cnblogs.com/a609251438/p/13224642.html
Copyright © 2020-2023  润新知