美文网首页
Swoole 创建TCP ECHO服务器

Swoole 创建TCP ECHO服务器

作者: zshanjun | 来源:发表于2017-04-18 19:37 被阅读107次

    开发环境搭建

    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给客户端。


    参考网站:

    相关文章

      网友评论

          本文标题:Swoole 创建TCP ECHO服务器

          本文链接:https://www.haomeiwen.com/subject/kfeqzttx.html