swoole_client->connect
最后更新于:2022-04-02 06:36:22
# swoole\_client->connect
[TOC]
连接到远程服务器,函数原型:
~~~
bool $swoole_client->connect(string $host, int $port, float $timeout = 0.5, int $flag = 0)
~~~
connect方法接受4个参数:
* `$host`是远程服务器的地址,`1.10.0`或更高版本已支持自动异步解析域名,`$host`可直接传入域名
* `$port`是远程服务器端口
* `$timeout`是网络IO的超时,包括`connect/send/recv`,单位是s,支持浮点数。默认为`0.5s`,即`500ms`
* $flag参数在`UDP`类型时表示是否启用`udp_connect`设定此选项后将绑定`$host`与`$port`,此`UDP`将会丢弃非指定`host/port`的数据包。
* `$flag`参数在`TCP`类型,`$flag=1`表示设置为非阻塞socket,connect会立即返回。如果将`$flag`设置为1,那么在`send/recv`前必须使用`swoole_client_select`来检测是否完成了连接
## 同步模式
connect方法会阻塞,直到连接成功并返回true。这时候就可以向服务器端发送数据或者收取数据了。
~~~
if ($cli->connect('127.0.0.1', 9501)) {
$cli->send("data");
} else {
echo "connect failed.";
}
~~~
如果连接失败,会返回`false`
> 同步TCP客户端在执行`close`后,可以再次发起`Connect`创建新连接到服务器
## 异步模式
`connect`会立即返回true。但实际上连接并未建立。所以不能在connect后使用`send`。通过`isConnected()`判断也是false。当连接成功后,系统会自动回调onConnect。这时才可以使用`send`向服务器发送数据。
> 异步客户端执行connect时会增加一次引用计数,当连接关闭时会减少引用计数
> 低于`1.9.11`的版本,`$timeout`超时设置`$timeout`在异步客户端中是无效的,应用层需要用`Timer::after`自行添加定时器来实现异步客户端的链接超时控制
> `1.9.11`或更高版本,底层会自动添加定时器,在规定的时间内未连接成功,底层会触发`onError`连接失败事件,错误码为`ETIMEOUT(110)`
## 失败重连
`connect`失败后如果希望重连一次,必须先进行`close`关闭旧的`socket`,否则会返回`EINPROCESS`错误,因为当前的socket正在连接服务器,客户端并不知道是否连接成功,所以无法再次执行`connect`。调用`close`会关闭当前的`socket`,底层重新创建新的`socket`来进行连接。
> 启用`SWOOLE_KEEP`长连接后,`close`调用的第一个参数要设置为`true`表示强行销毁长连接socket
~~~
if ($socket->connect('127.0.0.1', 9502) === false) {
$socket->close(true);
$socket->connect('127.0.0.1', 9502);
}
~~~
## UDP Connect
默认底层并不会启用`udp connect`,一个`UDP`客户端执行`connect`时,底层在创建`socket`后会立即返回成功。这时此`socket`绑定的地址是`0.0.0.0`,任何其他对端均可向此端口发送数据包。
如`$client->connect('192.168.1.100', 9502)`,这时操作系统为客户端`socket`随机分配了一个端口`58232`,其他机器,如`192.168.1.101`也可以向这个端口发送数据包。
> 未开启`udp connect`,调用`getsockname`返回的`host`项为`0.0.0.0`
将第`4`项参数设置为`1`,启用`udp connect`,`$client->connect('192.168.1.100', 9502, 1, 1)`。这时将会绑定客户端和服务器端,底层会根据服务器端的地址来绑定`socket`绑定的地址。如连接了`192.168.1.100`,当前`socket`会被绑定到`192.168.1.*`的本机地址上。启用`udp connect`后,客户端将不再接收其他主机向此端口发送的数据包。
';