php+swoole自定义tcp服务端、tcp客户端

部署完成swoole扩展之后,可以编写一个简单的tcp服务,这里的tcp服务是在我的云服务器上编写的,因为Windows没有swoole扩展,所以下面的代码都在云服务器上编写

tcp服务
<?php
//创建Server对象,监听127.0.0.1:6070端口
$server = new \Swoole\Server('0.0.0.0', '6070');

//可选参数
$server->set([
    //启动时worker进程的数量
    'worker_num' => 1
]);

/**
 * 监听连接进入事件
 * param $server Server对象
 * param $fd 连接该tcp服务的客户端id
 * param $reactorId 接收该客户端请求的线程id
 */
$server->on('Connect', function (swoole_server $server, int $fd, int $reactorId) {
    //有新连接连接服务器时
    echo "有新连接接入." . $fd . "\n";
});
/**
 * 监听数据接收事件
 * param $server Server对象
 * param $fd 连接该tcp服务的客户端id
 * param $reactorId 接收该客户端请求的线程id
 * param $data 服务端接收到的数据
 */
$server->on('Receive', function (swoole_server $server, int $fd, int $reactor_id, string $data) {
    //接收导数据时:服务端向客户端返回数据
    $server->send($fd, '客户端返回' . $data);
});

/**
 * 监听连接关闭事件
 * param $server Server对象
 * param $fd 连接该tcp服务的客户端id
 * param $reactorId 接收该客户端请求的线程id
 */
$server->on('Close', function (swoole_server $server, int $fd, int $reactor_id) {
    //客户端离开时:输出
    echo $fd . " 离开了我们\n";
});

$server->start();

运行上面的代码

在这里插入图片描述

查看服务其端口占用(我这里用的是6070端口)

lsof -i:6070

在这里插入图片描述

查看进程

ps -ef | grep php

在这里插入图片描述

这里可以看到有三个进程,这里的三个进程分别为:master主进程、manager进程、worker进程,其中worker进程为处理事件的进程,在前面的代码中可以设置多个worker_num。设置多几个,这里的进程就会多几个。

tcp客户端
<?php
//tcp客户端连接
$client = new \Swoole\Client(SWOOLE_SOCK_TCP);
//连接到服务器 (ip, 端口, 超时时间)
$client->connect('127.0.0.1',6070,0.5);

//发送给服务器的数据
$data = '客户端数据1';

//向服务端发送数据
$client->send($data);

//接收服务端返回的数据,字节大小设置6000
$res = $client->recv(6000);
//关闭客户端连接
$client->close();
//输出服务端返回的数据
echo $res."\n";

保持tcp服务端为开启状态

在这里插入图片描述

然后运行tcp客户端代码,客户端运行结果

在这里插入图片描述

服务端运行结果

在这里插入图片描述

这里客户端不手动关闭会一直为等待接收数据状态,这样一个简单的tcp服务端,和tcp客户端就实现了

原生php实现tcp客户端

我们在没有swoole扩展的本地环境中访问我们云服务器的tcp服务时,首先需要一些配置,让本地环境可以访问云服务中我们编写的tcp服务端口,这个困扰了我很久才解决。

1、首先第一步必须在云服务器的控制面板中放行我们编写的端口(我这里为6070),这里必须打开,不然不能远程访问该端口。

在这里插入图片描述

2、在云服务器的防火墙放行我们编写tcp服务的端口号(我这里为6070)

查看防火墙状态

firewall-cmd --state

查看某个端口是否放行

firewall-cmd --query-port=6070/tcp

放行指定端口

firewall-cmd --zone=public --add-port=6070/tcp --permanent

重启防火墙

systemctl restart firewalld.service

重新载入配置

firewall-cmd --reload

查看防火墙放行端口

/sbin/iptables -L -n

在这里插入图片描述

这样就配置完成

本地代码

<?php
//原生php发起一个tcp请求
//socket当成一个网络中的文件
$client = stream_socket_client("tcp://8.131.95.189:6070",$errno,$errstr,1);
if (!$client){
    echo "$errstr ($errno) <br/>\n";
}
//发送数据,写文件的过程
fwrite($client,'这是一个php的连接');

//接收数据,读文件的过程
$echo = fread($client,9000);

//关闭请求
fclose($client);

echo $echo;

本地运行改代码,本地输出

在这里插入图片描述

服务端输出

在这里插入图片描述

这里输出的2就是我们本地连接的pid,这样就完成了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值