Swoole入门 - TCP 服务
2019-05-29 本文已影响0人
铁匠简记
说明:机器还是之前的机器,环境还是还是之前的环境。
手册绝对是我们学习的第一手资料,也是最有价值的资料,所以请不要丢掉它。
首先进入之前进入我的目录
[zhengzongqiang@localhost server]$ pwd
/opt/work/htdocs/swoole_mooc/demo/server
创建tcp服务端文件
[zhengzongqiang@localhost server]$ sudo vim tcp.php
打开文档相关说明,并认真阅读(我必须说明:开源的框架,挣点广告费我是支持的;我的观点跟我的马赛克并不冲突)
image文档还是好东西,一定要借鉴(我有认真阅读的,并且为了方便自己看效果有小的改动)
[zhengzongqiang@localhost server]$ cat tcp.php
<?php
//创建Server对象,监听 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);
$serv->set([
'worker_num' => 4, // worker 进程数,cpu的1-4倍
'max_request'=> 10000
]);
// 命令行查看server开启的worker数
// ps aft | grep swoole_tcp_server.php
//监听连接进入事件
$serv->on('connect', function ($serv, $fd, $reactor_id) {
echo "Client: {$reactor_id} - {$fd} - Connect.\n";
});
//监听数据接收事件
$serv->on('receive', function ($serv, $fd, $reactor_id, $data) {
$serv->send($fd, "Server: " . 'reactor_id:'. $reactor_id . ' fd:' . $fd . ' data:' . $data."\n");
});
//监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
echo "Client: {$fd} - Close.\n";
});
//启动服务器
$serv->start();
于是以上代码片段就被借鉴(ban)到了我们刚刚创建的tcp.php。
保存退出后,执行此文件开启tcp服务。
文档同样贴心的告诉我们如何验证,在新的会话中使用telnet连接服务:
[zhengzongqiang@localhost ~]$ telnet 127.0.0.1 9501
当使用telnet工具连接之后,服务端便处罚connect事件,并打印1号客户已经连接
[zhengzongqiang@localhost server]$ php tcp.php
Client: 0 - 1 - Connect.
在客户端发送消息hello,可以接收到server端的ack
[zhengzongqiang@localhost ~]$ telnet 127.0.0.1 9501
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hello
Server: reactor_id:0 fd:1 data:hello
创建tcp客户端文件 tcp.php
进入客户端目录
[zhengzongqiang@localhost client]$
/opt/work/htdocs/swoole_mooc/demo/client
创建tcp.php文件
[zhengzongqiang@localhost client]$ sudo vim tcp.php
当然,如你所想,文档中有值得我们借鉴的东西(这次只是看了文档,但为了实现telnet的效果,这里使用php cli常量)
[zhengzongqiang@localhost client]$ cat tcp.php
<?php
// 连接swoole tcp server
$client = new swoole_client(SWOOLE_SOCK_TCP);
if(!$client->connect("127.0.0.1",9501)){
echo "连接失败";
exit;
}
// php cli常量:STDIN:cli输入 STDOUT:cli输出
fwrite(STDOUT,"请输入消息");
// 接收用户输入
$msg = trim(fgets(STDIN));
// 发送消息给 tcp server,返回值为发送的信息长度
$send = $client->send($msg);
if($send){
echo 'send'. $send."\n";
}
// 接受来自 server 的数据
$result = $client->recv();
echo 'recv:'. $result."\n";
这时需要打开两个会话窗口,一个执行server端程序文件,一个执行client端程序文件,执行client端程序文件后,server显示1号客户端连接。
// server
[zhengzongqiang@localhost server]$ php tcp.php
Client: 0 - 1 - Connect.
在客户端输入hello,可接收到server端的回复
[zhengzongqiang@localhost client]$ php tcp.php
请输入消息hello
send5
recv:Server: reactor_id:0 fd:1 data:hello
[zhengzongqiang@localhost client]$
一个小技巧
查看server端设置的worker数量,通过以下命令可以看到,我们设置的worker_num为4。
[zhengzongqiang@localhost client]$ ps aft | grep tcp.php
7353 pts/3 S+ 0:00 \_ grep --color=auto tcp.php
7281 pts/0 Sl+ 0:00 \_ /opt/soft/php/bin/php tcp.php
7282 pts/0 S+ 0:00 \_ /opt/soft/php/bin/php tcp.php
7284 pts/0 S+ 0:00 \_ /opt/soft/php/bin/php tcp.php
7285 pts/0 S+ 0:00 \_ /opt/soft/php/bin/php tcp.php
7286 pts/0 S+ 0:00 \_ /opt/soft/php/bin/php tcp.php
7287 pts/0 S+ 0:00 \_ /opt/soft/php/bin/php tcp.php
通过以上学习,tcp服务入门,会看文档,UDP也就会了。你会发现Swoole没那么神秘;通过后续学习你会发现,能够准确的形容Swoole的词,应该是‘酷’!