三十八、Swoole 基础学习笔记 - Swoole 协程 Socket 客户端

作者: 温新

分类: 【Swoole 系列】

阅读: 1736

时间: 2023-03-13 12:31:27

hi,我是温新,一名PHPer

文章基于 Swoole 5.0.1 版本编写。

学习目标:学习协程 Socket 服务器

说明:本篇文章结合官方文档编写及参考网络资料编写,虽非全部原创,但也是结合了自己的理解,若转载请附带本文 URL,编写不易,持续编写更不易,谢谢!

本文章使用第 35 篇文章的服务端代码。

Swoole\Coroutine\Socket 模块相比协程风格服务端和协程客户端相关模块 Socket 可以实现更细粒度的一些 IO 操作。

Socket 案例

<?php
// 38-swoole-coroutine-socket-client.php

Swoole\Coroutine\run(function () {
    $socket = new Swoole\Coroutine\Socket(AF_INET, SOCK_STREAM, 0);

    $retval = $socket->connect('127.0.0.1', 9501);
    while ($retval) {
        $socket->send('hello');
      
        $data = $socket->recv();

        echo $data . PHP_EOL;


        //发生错误或对端关闭连接,本端也需要关闭
        if ($data === '' || $data === false) {
            echo "errCode: {$socket->errCode}\n";
            $socket->close();
            break;
        }

        Swoole\Coroutine::sleep(1.0);
    }

    var_dump($retval, $socket->errCode, $socket->errMsg);
});

输出结果:

$php 38-swoole-coroutine-socket-client.php 
我是神界接引人

errCode: 104
bool(true)
int(104)
string(24) "Connection reset by peer"

Socket API

__construct

含义:构造方法。构造 Coroutine\Socket 对象。

语法&参数:

Swoole\Coroutine\Socket::__construct(int $domain, int $type, int $protocol);

# 参数
$domain:协议域【可使用 AF_INET、AF_INET6、AF_UNIX】
$type:类型【可使用 SOCK_STREAM、SOCK_DGRAM、SOCK_RAW】
$protocol:协议【可使用 IPPROTO_TCP、IPPROTO_UDP、IPPROTO_STCP、IPPROTO_TIPC,0】

setOption

含义:设置配置。

语法&参数:

Swoole\Coroutine\Socket->setOption(int $level, int $optname, mixed $optval): bool

# 参数
$optname:可用的套接字选项与 socket_get_option() 函数套接字选项相同
$$optva:选项的值 【可以是 int、bool、string、array。根据 level 和 optname 决定。】

getOption

含义:获取配置。

语法&参数:

Swoole\Coroutine\Socket->getOption(int $level, int $optname): mixed
    
# 参数
$level:指定选项所在的协议级别
$optname::可用的套接字选项与 socket_get_option() 函数的套接字选项相同

bind

含义:绑定地址和端口。

语法&参数:

Swoole\Coroutine\Socket->bind(string $address, int $port = 0): bool

# 参数
$address:绑定的地址【如 0.0.0.0、127.0.0.1】
$port:端口

listen

含义:监听 socket

语法:Swoole\Coroutine\Socket->listen(int $backlog = 0): bool

accept

含义:客户端发起连接。

语法:

Swoole\Coroutine\Socket->accept(float $timeout = 0): Coroutine\Socket|false;

send

含义:向对端发送数据。

语法:

Swoole\Coroutine\Socket->send(string $data, float $timeout = 0): int|false

recv

含义:接手数据。

<?php
// 38-swoole-coroutine-socket-server-1.php

// 实现 socket 协程服务端
Swoole\Coroutine\run(function () {
    $socket = new Swoole\Coroutine\Socket(AF_INET, SOCK_STREAM, 0);
    $socket->bind('127.0.0.1', 9601);
    $socket->listen(128);
    while(true) {
        $client = $socket->accept();
        if ($client === false) {
            var_dump($socket->errCode);
        } else {
            echo $client->recv() . PHP_EOL;
        }
    }
});

close

含义:关闭 socket。

语法:Swoole\Coroutine\Socket->close(): bool

关于 socket 其他参数参考官方文档。

请登录后再评论