三十八、Swoole 基础学习笔记 - Swoole 协程 Socket 客户端
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 其他参数参考官方文档。
请登录后再评论