swoole学习第一天,SWOOLE_SOCK_TCP/UDP
前面源码安装完成,现在进入学习时间,顺便做一些笔记
//创建server端代码
https://wiki.swoole.com/wiki/page/14.html
<?php //创建对象 $server = new Swoole_server('0.0.0.0',9501); $server->set(array( 'worker_num' => 2, //设置启动的Worker
进程数量。Swoole
采用固定Worker
进程的模式。 'max_request' => 100 //此参数表示worker进程在处理完n次请求后结束运行。manager会重新创建一个worker进程。此选项用来防止worker进程内存溢出。 )); //监听连接进入事件 /** * $fd 表示客户端链接server的唯一标识,自增的形式 * $reactor_id 线程标识 */ $server->on('Connect', function ($server, $fd, $reactor_id){ echo "Connect:{$fd} - {$reactor_id} success\n"; }); //监听链接接收事件 $server->on('receive', function ($server, $fd, $from_id, $data){ //send给客户端发送数据 $fd 客户端唯一标识 //$from_id 线程ID $server->send($fd, "Server:{$fd} - {$from_id} - {$data}\n"); echo 'get '.$fd .':'.$data."\n"; }); //关闭监听事件 $server->on('Close', function ($server, $fd){ echo "Close {$fd}\n\n"; }); $server->start();
验证是否可用方法有多种
第一种:命令形式
root@VM-0-16-ubuntu:/data/www# telnet 127.0.0.1 9501 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 123 Server:4 - 0 - 123
服务端输出打印对应的输出
Connect:4 - 0 success
get 4:123
第二种方法,使用swoole client 服务
https://wiki.swoole.com/wiki/page/29.html
//创建对象 $client = new Swoole_client(SWOOLE_SOCK_TCP);
//判断是否连接成功,返回bool值 if (!$client->connect('127.0.0.1', 9501)){ echo "Connect error\n"; exit; }; //PHP cli常量 fwrite(STDOUT,'请输入:'); $msg = trim(fgets(STDIN)); //发送消息给服务器 ,判断是否发送成功 返回 bool值 if (!$client->send($msg)){ echo "send error\n"; }; //接收服务器发送的数据 $res = $client->recv(); echo $res . "\n";
肯能还有别的方法来验证,才疏学浅只能用这两种方式
最后,查看server的set设置是否生效可以使用ps命令查看,如修改需要重启服务端server
root@VM-0-16-ubuntu:/data/www# ps -aft | grep tcp_server.php 13059 pts/3 S+ 0:00 \_ grep --color=auto tcp_server.php 12828 pts/2 Sl+ 0:00 \_ /usr/local/php/bin/php tcp_server.php 12829 pts/2 S+ 0:00 \_ /usr/local/php/bin/php tcp_server.php 12831 pts/2 S+ 0:00 \_ /usr/local/php/bin/php tcp_server.php 12832 pts/2 S+ 0:00 \_ /usr/local/php/bin/php tcp_server.php
------------------------------
SEOOLE UDP
http://wiki.swoole.com/wiki/page/477.html
swoole的udp和tcp区别还是很大的。
UDP服务器与TCP服务器不同,UDP没有连接的概念。启动Server后,客户端无需Connect,直接可以向Server监听的9502端口发送数据包。对应的事件为onPacke。
<?php //采用UDP方式SWOOLE_SOCK_UDP //UDP服务器与TCP服务器不同,UDP没有连接的概念。启动Server后,客户端无需Connect,直接可以向Server监听的9502端口发送数据包。对应的事件为onPacke $server = new Swoole_server('0.0.0.0', 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); $server->set(array( 'worker_num' => 2, 'max_request' => 100, )); /** * $data Client发送的数据 * $clientInfo Client信息 * UDP fd的概念。 */ $server->on('Packet', function ($server, $data, $clientInfo){ //这里注意tcp这里使用的是send,而UDP使用的是sendto //向任意的客户端IP:PORT发送UDP数据包。 $server->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data); var_dump($clientInfo); }); $server->start();
server启动之后,会启动一个进程,默认不是4个,就一个主进程,来处理数据。
//'task_worker_num' => 4, //业务请求量很大,一个worker 肯定是不够的,我们利用多个task worker的方式来改写下server。
root@VM-0-16-ubuntu:/data/www# ps -aft | grep udp_server.php 19316 pts/3 S+ 0:00 \_ grep --color=auto udp_server.php 19304 pts/2 Sl+ 0:00 \_ /usr/local/php/bin/php udp_server.php 19305 pts/2 S+ 0:00 \_ /usr/local/php/bin/php udp_server.php 19312 pts/2 S+ 0:00 \_ /usr/local/php/bin/php udp_server.php
Clinet端代码
<?php $client = new Swoole_client(SWOOLE_SOCK_UDP); $client->connect('127.0.0.1', 9502); //PHP cli常量 fwrite(STDOUT,'请输入:'); $msg = trim(fgets(STDIN)); //发送消息给服务器 if (!$client->send($msg)){ echo "send error\n"; }; //接收服务器发送的数据 $res = $client->recv(); echo $res . "\n";