swoole tcp client/server-献给swoole初初初初初初学者们

环境

  • 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 都给咱们封装好了,咱们只须要把业务逻辑写在相应的回调函数内便可php

相关文章
相关标签/搜索