swoole学习手记(二)建立服务器(上)

目录php

持续更新中。。。html

1.建立tcp服务器

先照着文档建立一个tcp服务器react

<?php
//建立服务器 参数分别是 
//监听的地址 127.0.0.1 表示监听本机,0.0.0.0表示监听全部地址
//9501 端口号 这个你随便定都行只要没被占用过(netstat -an | grep 查看端口使用状况) 若是被占用就使用 命令 kill杀死进程
//SWOOLE_PROCESS 为多进程模式,通常这里不传值,默认为多进程 SWOOLE_BASE为基本模式 
//SWOOLE_SOCK_TCP 也就是说建立tcp服务器 
$serv=new swoole_server('127.0.0.1','9501',SWOOLE_PROCESS,SWOOLE_SOCK_TCP);

//服务器设置参数
$serv->set([
'worker_num'=>4,  //worker进程数 通常为cpu数的 1-4倍
'max_request'=>10000, //worker进程在处理完n次请求后结束运行重建一个
]);
//这里
//固然还有不少设置的参数 文档传送门:https://wiki.swoole.com/wiki/page/13.html

//监听链接进入事件(这里是一个闭包写法)链接后调用的函数
//$fd客户端链接的惟一标示
//$reactor_id 线程id 是一个自增数字,范围是1 ~ 1600万,fd超过1600万后会自动从1开始进行复用
$serv->on('connect', function ($serv, $fd, $reactor_id) {
    echo "Client: {$reactor_id} - {$fd}-Connect.\n";
});

//监听数据接收事件
//$data就是接收的数据
$serv->on('receive', function ($serv, $fd, $reactor_id, $data)) {
    $serv->send($fd, "Server: ".$data);
    echo '收到了数据'.$data;
});

//监听链接关闭事件
$serv->on('close', function ($serv, $fd) {
    echo "Client: Close".$fd."\n";
});

//启动服务器
$serv->start();

ok咱们测试一下 php tcp.php 打开tcp服务器(若是端口被占用,则杀死占用端口的进程,关掉使用ctrl+c,挂起使用ctrl+z)
clipboard.pngsegmentfault

再打开telnet(咱们要再打开一个终端)测试一下是否是成功了,随便输入eqqeq服务器

clipboard.png

再看看tcp服务器微信

clipboard.png

看到这里咱们整理一下思路:
建立了tcp服务器->telnet链接服务器->tcp执行connect->telnent发送信息->tcp监听到receive事件->telnent断开->tcp 监听到close事件swoole


疑问
1.server与telnet的关系
服务器与客服端的关系,一个server对应多个telnet闭包

2.$serv->send($fd, "Server: ".$data); 和 直接输出 echo 有什么区别呀?异步

send是发送数据 给 对方(链接我服务器的) ,好比你用微信和你的朋友聊天,你发了一个server: ".$data,那么就至关于你把消息发给了你朋友, 而echo的话是输出内容,只给本身。tcp

3.线程与进程是什么鬼?
至关于一个工厂(CPU)里的多个车间(进程)
一个车间(进程)有不少个工人(线程)
车间里面有厕所(共享内存),工人均可以共用,可是你得等工人用完才能够进去

咱们平时使用php是单进程,那么大的工厂就用了一个车间效率固然慢,
因此咱们要多个车间(多进程),多个员工(线程),来提升效率

注意:
每次修改服务器脚本文件后都要
关闭进程再从新打开才会生效

2.建立udp服务器

1.TCP核ucp都是传输层协议,可是UDP服务器与TCP服务器不一样,UDP没有链接的概念,udp消耗资源比较小,可是速度快。启动Server后,客户端无需Connect,直接能够向Server监听的9502端口发送数据包。

2.udp的建立方式跟tcp很像

//就是把最后一个参数改成 SWOOLE_SOCK_UDP 
$serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);

3.UDP服务器可使用不用telnet而是用 netcat -u 来链接测试
nc安装:
yum -y install yum -y install nc.x86_64 使用就是直接 nc -u 127.0.0.1 9502

4.完整的实现

//建立Server对象,监听 127.0.0.1:9502端口,类型为SWOOLE_SOCK_UDP
$serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);
 
//udp没有 $serv->on connect的概念

//监听数据接收事件
$serv->on('Packet', function ($serv, $data, $clientInfo) {
    $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data);
    var_dump($clientInfo);
});

//启动服务器
$serv->start();

5.测试,一样咱们也打开2个终端
udp服务器 这里咱们打印了$clientInfo

clipboard.png

nc测试服务器

clipboard.png


ok测试没有问题^-^

思考:tcp与udp都是传输层协议的server,那么基于传输层的应用层server又会是怎样的呢?

若是这篇文章对你有用,能够点个赞或者是收藏,算是对做者的鼓励~

文档地址传送门:https://wiki.swoole.com/wiki/...
推荐singwa老师的视频教程:https://coding.imooc.com/clas...

另附上小弟网站。。。www.entercode.cn 推广一波...

相关文章
相关标签/搜索