环境
- PHP5.6.17
- Swoole 1.8.8-stable
- Ubuntu 14.04 (use_namespace 需要开启命名空间)
学前提要
- Server 角色并不是一成不变的,当 Server 在请求数据时,实际上就是 Client,相对的 Client 在提供数据时,就是 Server
- 请求数据用 \Swoole\Client,提供数据使用 \Swoole\Server
- 实例化时参数暂时不予理会,先体验一把 swoole 再说
启动一个 TCP Server
$server = new \Swoole\Server('0.0.0.0', 10005, SWOOLE_BASE, SWOOLE_SOCK_TCP);
// 回调函数 connect , 当有新的客户端连接时,会调用此方法
$server->on('connect', function(\Swoole\Server $server, $fd, $fromId){
echo sprintf("new client %s joined " . PHP_EOL, $fd);
});
// 回调函数 receive, 当接收到客户端数据时,会调用此方法
$server->on('receive', function(\Swoole\Server $server, $fd, $fromId, $receive){
$server->send($fd, sprintf("server got message %s from %s ", trim($receive), $fd));
});
// 回调函数 close, 客户端断开连接时会调用此方法
$server->on('close', function(\Swoole\Server $server, $fd, $fromId){
echo sprintf("client %s closed" . PHP_EOL, $fd);
});
// 启动服务器
$server->start();
启动一个 TCP Client,连接 server
$client = new \Swoole\Client(SWOOLE_TCP, SWOOLE_SOCK_ASYNC);
// 连接服务器成功会回调此方法
$client->on('connect', function(\Swoole\Client $client) {
echo sprintf("connect success" . PHP_EOL);
$content = fopen('php://stdin', 'r');
echo "Say: ";
$client->send(fgets(STDIN));
});
// 接收到服务器消息回调此方法
$client->on('receive', function(\Swoole\Client $client, $receive) {
echo sprintf("got message: [%s] from server" . PHP_EOL, $receive);
$content = fopen('php://stdin', 'r');
echo "Say: ";
$client->send(fgets(STDIN));
});
// 关闭连接时会回调此方法
$client->on('close', function(\Swoole\Client $client) {
echo sprintf("client close" . PHP_EOL);
});
// 有错误时会回调此方法
$client->on('error', function(\Swoole\Client $client) {
echo sprintf("got error %s" . PHP_EOL, swoole_strerror($client->errCode));
});
$client->connect('0.0.0.0', 10005);
流程
- 服务端启动,监听端口,等待客户端连接
- 客户端建立连接
- 发送消息
- 服务端响应
- 客户端关闭连接
事实上整个过程远比上面复杂,但 swoole 都给我们封装好了,我们只需要把业务逻辑写在相应的回调函数内即可