开发环境搭建
1、服务器运行环境:windows下的ubuntu虚拟机(vmware)
使用的ubuntu版本为14.04
2、IDE:windows下使用phpstorm
推荐添加swoole-ide-helper到phpstorm的External Libraries(双击图标即可添加)
3、共享文件夹
vmware打开共享文件夹方式:
安装Vmware-tools工具包,安装好客户机后,VM菜单下有一个Reinstall VMware Tools,直接单击,该工具包被加载到客户机桌面。
命令行模式下复制安装的tar文件到某个文件夹或/tmp下直接解压。
到相应的解压目录下执行vmware-install.pl,一路根据提示安装即可。
右单击你需要设置该功能的虚拟机,单击options,可以看到Shared Folders功能,单击该项设置右侧的Always enabled后,单击add添加你需要设置的共享文件所在的位置即可。
最后,启动Ubuntu虚拟机,进入/mnt/hgfs/目录既可以看到共享目录。
搭建TCP ECHO 服务器
新建server.php
<?php
//创建Server对象,监听 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);
//监听连接进入事件
$serv->on('connect', function ($serv, $fd) {
echo "Client: Connect.\n";
});
//监听数据接收事件
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
$serv->send($fd, "Server: ".$data);
});
//监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
echo "Client: Close.\n";
});
//启动服务器
$serv->start();
使用php server.php
启动服务器
搭建异步TCP客户端
新建async_client.php文件
<?php
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);
//注册连接成功回调
$client->on('connect', function($cli) {
$cli->send("hello world\n");
});
//注册连接失败回调
$client->on('error', function($cli) {
$cli->send("connect failed\n");
});
//注册数据接受回调
$client->on('receive', function($cli, $data) {
echo "Received: $data\n";
sleep(1);
$cli->send("wake up");
});
//注册连接关闭回调
$client->on('close', function($cli) {
echo "closed\n";
});
//发起连接
$client->connect('127.0.0.1', 9501, 0.5);
使用php async_client.php
打开客户端
使用tcpdump进行抓包分析
首先开启服务器,打开tcpdump监听sudo tcpdump -iany tcp port 9501
。
使用telnet进行连接测试,连接上后发送nihao,然后ctrl+]quit结束整个过程。
结果如下:
09:22:06.206068 IP localhost.36366 > localhost.9501: Flags [S], seq 3315326447, win 43690, options [mss 65495,sackOK,TS val 940145 ecr 0,nop,wscale 7], length 0
09:22:06.206140 IP localhost.9501 > localhost.36366: Flags [S.], seq 3454419015, ack 3315326448, win 43690, options [mss 65495,sackOK,TS val 940145 ecr 940145,nop,wscale 7], length 0
09:22:06.206158 IP localhost.36366 > localhost.9501: Flags [.], ack 1, win 342, options [nop,nop,TS val 940145 ecr 940145], length 0
09:22:06.206571 IP localhost.9501 > localhost.36366: Flags [P.], seq 1:7, ack 1, win 342, options [nop,nop,TS val 940145 ecr 940145], length 6
09:22:06.206648 IP localhost.36366 > localhost.9501: Flags [.], ack 7, win 342, options [nop,nop,TS val 940145 ecr 940145], length 0
09:22:10.978286 IP localhost.36366 > localhost.9501: Flags [P.], seq 1:8, ack 7, win 342, options [nop,nop,TS val 941338 ecr 940145], length 7
09:22:10.978302 IP localhost.9501 > localhost.36366: Flags [.], ack 8, win 342, options [nop,nop,TS val 941338 ecr 941338], length 0
09:22:10.978457 IP localhost.9501 > localhost.36366: Flags [P.], seq 7:23, ack 8, win 342, options [nop,nop,TS val 941338 ecr 941338], length 16
09:22:10.978462 IP localhost.36366 > localhost.9501: Flags [.], ack 23, win 342, options [nop,nop,TS val 941338 ecr 941338], length 0
09:22:17.296437 IP localhost.36366 > localhost.9501: Flags [F.], seq 8, ack 23, win 342, options [nop,nop,TS val 942918 ecr 941338], length 0
09:22:17.297329 IP localhost.9501 > localhost.36366: Flags [F.], seq 23, ack 9, win 342, options [nop,nop,TS val 942918 ecr 942918], length 0
09:22:17.297339 IP localhost.36366 > localhost.9501: Flags [.], ack 24, win 342, options [nop,nop,TS val 942918 ecr 942918], length 0
简单分析:
一开始三次握手,建立连接:首先客户端随机分配一个端口来连接服务器,Flags标志为[S],服务器收到以后也返回一个Flags标志为[S]的响应,最终客户端在发送一个Flags标志为[.]进行确认。此过程即为3此握手。
同理,结束连接时也要经历3此握手,不过此时的标志有所不同,分别为[F] [F] [.](也可能是R)。
建立连接成功后,根据脚本,发送了Hello\n
给客户端,在第四个请求那里也可以看到长度为6个字节, 类型为[P],接受到信息以后客户端返回确认,标志为[.]。
然后,客户端输入了nihao
发送给客户端,服务端接受到后再返回Server nihao
给客户端。
参考网站:
网友评论