Swoole学习一之TCP协议

2019-07-22 10:35:39 浏览数 (1)

什么是Swoole?

Swoole是一个高性能的网络通信引擎,提供了多种的网络通信协议。例如UDP、TCP、Http和WebSocket等各种通信协议。可以使完全同步的代码实现异步执行程序,例如异步Redis、异步MySQL、协程Http等异步IO操作。

如何安装Swoole

Swoole作为PHP的一个扩展库,在使用的过程中也和其他的函数库并无什么使用上的差别,但这个库又不是一个普通的库。这个库分为服务端和客户端,首先我们需要去通过内置的函数启动服务,然后在去请求服务。 安装的步骤也很简单,和其他的PHP函数库操作并差别,直接可以参考安装步骤 ,按照教程安装完成之后,我们就可以正常使用啦!PHP安装Swoole扩展

第一个Demo

该demo是一个TCP服务的简单示例。 1.服务端代码

代码语言:javascript复制
<?php
//  1.创建一个swoole对象
/**
 * swoole_server(主机地址,端口号);
 */
$swoole = new swoole_server('127.0.0.1', 9502);

// 设置连接参数
$swoole->set([
    'reactor_num' => 2, // 线程数(全异步非阻塞服务器 worker_num配置为CPU核数的1-4倍即可)
    'worker_num' => 2, // 工作进程数,该配置小于reactor_num配置时,swoole自动降低reactor_num的配置数
    'max_conn' => 2, // 最大连接数(当前演示版本最低为36)
    'max_request' => 100, // 最大请求数,表示在worker进程处理完n个请求之后,manager进程重新创建一个worker进程来处理请求,避免造成内存溢出情况.
    'log_file' => '/usr/local/var/www/swoole/log/log.log',// 错误日志文件
    'heartbeat_check_interval' => 30, // 轮询所有TCP连接,将超过心跳时间的连接关闭掉
    'heartbeat_idle_time' => 30 // 心跳时间检测,如果tcp连接超过该时间之后,会自动关闭连接
]);

//  2.监听连接事件
/**
 * on(event_name,function(swoole对象,客户端标识){});
 */
$swoole->on('connect', function ($swoole, $fd) {
    echo '客户端' . $fd . '在' . date('Y-m-d H:i:s') . '连接成功';
});

//  3.监听接收数据事件
/**
 *on(event_name,function(swoole对象,客户端标识,线程数,客户端数据){});
 */
$swoole->on('receive', function ($swoole, $fd, $reactor_id, $data) {
    $swoole->send($fd, '用户发送的数据为' . $data . '客户端标志为' . $fd . '来源form_id为' . $reactor_id);
});

//  4.监听链接关闭事件
/**
 * on(event_name,function(swoole对象,客户端标识){});
 */
$swoole->on('close', function ($swoole, $fd) {
    echo '客户端' . $fd . '在' . date('Y-m-d H:i:s') . 'close-success';
});

// 5.启动服务
$swoole->start();

2.客户端代码

代码语言:javascript复制
<?php
/**
 * Created Author: 编程浪子走四方
 * Author: 编程浪子走四方
 * System: Mac Pro
 * System User: apple
 * Date: 2019-07-12
 * Time: 11:15
 */
// 1.创建客户端连接对象并且连接为tcp连接
$ser = new swoole_client(SWOOLE_SOCK_TCP);

// 2.创建swoole连接
$ser->connect('127.0.0.1', 9502);

// 3.客户端输入数据并接收
fwrite(STDOUT, '请输入内容:');
$content = fwrite(STDOUT, fgets(STDIN));

// 4.将数据发送到swoole服务(可以将服务端的代码中的3相互对应参考)
$ser->send($content);

// 5.接受swoole服务返回的数据
$result = $ser->recv();

echo $result;

// 6.关闭连接
$ser->close();

如何操作第一个Demo

1.启动我们的Swoole,服务端的代码是PHP文件编写,所以我们用cli模式来启动服务(在Swoole中绝大部分的操作都是cli模式)

代码语言:javascript复制
php index.php

这样Swoole服务就启动了。接下来,查看我们设置的9502端口是否被开启,来验证我们的服务是否真正的被打开了。

代码语言:javascript复制
ps -anp | grep 9502

接下来,我们测试一个客户端向服务器端发送数据.执行客户端代码,这个案例需要结合上面的服务端和客户端的代码便知晓.

代码语言:javascript复制
php index.php

除了使用PHP代码当客户端使用外,TCP协议还支持telnet连接,下面使用telnet测试连接.

代码语言:javascript复制
telnet 127.0.0. 9502

如果出现下面的结果,则表示能够正常连接,同时我们也可以输入任意内容,服务端接收到数据之后就会输出到终端.

测试多个连接.在Swoole中,可以开启一个服务多个客户端,因此我们只需要启动一个Swoole服务,创建多个telnet连接也是可行的.我们打开多个窗口去使用telnet连接服务端,此时会看到服务端终端输出如下信息.

0 人点赞