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`后,客户端将不再接收其他主机向此端口发送的数据包。
';