swoole深入学习 3. upd Server和udp Client
来源:互联网 发布:农村淘宝开业计划书 编辑:程序博客网 时间:2024/06/13 09:14
swoole深入学习 3. upd Server和udp Client
标签(空格分隔): swoole
前面主要讲了tcp得server和client的业务处理,tcp有三次握手,有连接的概览,而UDP服务器与TCP服务器不同,UDP没有连接的概念。启动Server后,客户端无需Connect,直接可以向Server监听的端口发送数据包。server 接受数据的事件为onPacket
, 发送给client的方法变成sendto
。
udp Server
<?php/** * Created by PhpStorm. * User: yangyi * Date: 2016/12/7 * Time: 18:02 *///创建Server对象,监听 127.0.0.1:9503端口,类型为SWOOLE_SOCK_UDP$serv = new Swoole\Server("127.0.0.1", 9503, SWOOLE_BASE, SWOOLE_SOCK_UDP);//监听数据发送事件$serv->on('Packet', function ($serv, $data, $clientInfo) { //发送给客户端 用sendto $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data); var_dump($data);});//启动服务器$serv->start();
udp client
<?php/** * Created by PhpStorm. * User: yangyi * Date: 2016/12/7 * Time: 18:02 */$client = new Swoole\Client(SWOOLE_SOCK_UDP);$client->connect('127.0.0.1', 9503, 1);$i = 0;while ($i < 1000) { $client->send($i."\n"); $message = $client->recv(); echo "Get Message From Server:{$message}\n"; $i++;}
上面server启动之后,会启动一个进程,默认不是4个,就一个主进程,来处理数据。
pstree |grep server.php| | \--= 87143 yangyi php udp_server.php
然后接受客户端的数据的监听的方法变成了Packet
了,而不是Receive
。发送数据给client 的方法为sendto
。需要客户端的地址和端口。这点和tcp不一样,没有fd
的概念。
$serv->sendto($clientInfo['address'], $clientInfo['port'], "something");
如果业务请求量很大,一个worker 肯定是不够的,我们利用多个task worker的方式来改写下server。
<?php/** * Created by PhpStorm. * User: yangyi * Date: 2016/12/7 * Time: 18:02 *///创建Server对象,监听 127.0.0.1:9503端口,类型为SWOOLE_SOCK_UDP$serv = new Swoole\Server("127.0.0.1", 9503, SWOOLE_BASE, SWOOLE_SOCK_UDP);$serv->set([ 'worker_num' => 4, # 4个worker 'task_worker_num' => 4, # 4个task 'deamonize' => false,]);//监听数据发送事件$serv->on('Packet', function ($serv, $data, $clientInfo) { $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data); var_dump($clientInfo, $data); //把任务丢给task $serv->task($data); });$serv->on('Task', function ($serv, $task_id, $from_id, $data) { echo "This Task {$task_id} from Worker {$from_id}\n"; echo "Data: {$data}\n"; //模拟慢io查询、 for($i = 0 ; $i < 2 ; $i ++ ) { sleep(1); echo "Task {$task_id} Handle {$i} times...\n"; } //return 数据 给 Finish return "Task {$task_id}'s result";});$serv->on('Finish', function ($serv,$task_id, $data) { echo "Task {$task_id} finish\n"; echo "Result: {$data}\n";});//启动服务器$serv->start();
再看下进程
$ pstree |grep server.php| | \-+= 88426 501 php udp_server.php #master | | \-+- 88427 501 php udp_server.php #manager | | |--- 88428 501 php udp_server.php #worker、task | | |--- 88429 501 php udp_server.php | | |--- 88430 501 php udp_server.php | | |--- 88431 501 php udp_server.php | | |--- 88432 501 php udp_server.php | | |--- 88433 501 php udp_server.php | | |--- 88434 501 php udp_server.php | | \--- 88435 501 php udp_server.php
发现启动了8个work进程和一个manager进程一个master进程
这样就完成了一个多worker的udp server。
启动server,再启动client。
server
$ php udp_server.php#打印udp的地址和ip/Users/yangyi/www/bestPHP/swoole/udp_server.php:22:array(3) { 'server_socket' => int(4) 'address' => string(9) "127.0.0.1" 'port' => int(55182)}#打印客户端发来的数据/Users/yangyi/www/bestPHP/swoole/udp_server.php:22:string(2) "0"#task启动This Task 0 from Worker 1Data: 0Task 0 Handle 0 times...Task 0 Handle 1 times...#task finishTask 0 finishResult: Task 0's result
client
$ php udp_client.php#获取server发回的数据Get Message From Server:Server 0
参考资料:
http://wiki.swoole.com/wiki/page/477.html
0 0
- swoole深入学习 3. upd Server和udp Client
- swoole深入学习 2. tcp Server和tcp Client
- 2Boost之UPD,Client and Server
- UDP通信client端和server端
- swoole深入学习 1. swoole初始
- ubuntu10.10下的upd通信(server,client)
- Python UDP Server Client
- UDP server,client 代码
- UDP Server/Client
- boost::asio学习之[四]udp client server 异步server
- swoole深入学习 4. process
- swoole深入学习 6. HttpServer
- swoole深入学习 7. WebSocket
- tcp和upd的区别?为啥要用udp
- UDP Client Server Echo Example
- JAVA UDP Server/Client Sample
- Simple UDP server and client
- 简单 TCP UDP server client
- dubbo学习笔记 十二 dubbo-cluster
- 寻找非共有数字
- 软件项目管理流程总结
- 第四章:shell处理用户输入
- swift语言的学习笔记四-2(对上一节有些遗留进行处理)
- swoole深入学习 3. upd Server和udp Client
- 抽象工厂模式
- Class文件内容及常量池
- swoole深入学习 4. process
- swift语言的学习笔记五(线程)
- webpack英文文档阅读笔记--ES6环境配置
- leetcode-344- Reverse String
- 解决svn无法cleanup
- 通俗讲解 异步,非阻塞和 IO 复用