php swoole TCP 服务器搭建及使用详解

实现目标:

tcp客户端实现与swoole搭建的tcp服务端通信传输数据,客户端请求提交数据,服务端接收数据存入数据库及对数据库查询结果返回给tcp客户端

php swoole wiki参考文档地址

https://wiki.swoole.com/#/start/start_tcp_server

用到的模拟工具:sockettool

首先理解以下TCP工作的原理

TCP的“三次握手”

TCP的三次握手可以确保服务器和客户端之间可以正常通信。三次握手的过程:至于这个过程的解释,可以点击下面的链接来查看。

参考:https://blog.csdn.net/Loli_Tio/article/details/79374401

 

IP和PORT
服务器需要有一个IP,TCP通信时,还需要提供一个端口号。
客户端需要有一个IP,TCP通信时,也需要提供一个端口号。

个人理解:IP就是地址,可以理解为一个房子,当你需要建立通信的时候,首先肯定得相互知道这个房子在哪里才可以吧,要不然我们得信息发送到哪里呢?
PORT端口,端口号可以理解为这个房子的一个门,我们需要指定一个门,将消息从这个门里面传送进去或者从这个门接受消息。

php swoole 扩展的安装

参考:https://wiki.swoole.com/#/environment

启动服务器:

<?php
/*
 * $host :  监听ip地址
 * 本地地址设置为:127.0.0.1
 * 外网ip:192.168.12.10
 * 监听多个ip地址设置为:0.0.0.0(监听的是ipv4)ipv6自行去官网查询用法
 * $port  : 端口号
 * 设置为1024以下的端口号需要root权限
 * $mode :   SWOOLE_PROCESS 多进程的方式
 * $socke_type  : SWOOLE_SOCK_TCP
 *
 * */
//创建一个服务器
$host = '0.0.0.0';//string
$port = 9502;//int
//$serv = new swoole_server($host,$port,$mode,$socke_type);
//$serv = new swoole_server($host,$port);
$serv = new Swoole\Server($host,$port);
//使用服务
/*
 * bool $swoole_server->on(string $event,mixid $callback);
 * $event:
 * connect : 当建立连接时  $server :服务器信息 $fd :客户端信息
 * receive : 当接收数据时  $serv服务器信息$fd客户端信息$from_id:ID  $data:数据
 * close :   当关闭连接时  $serv服务器信息$fd客户端信息
 * */
$serv->set([
    //'open_eof_check' => true,
    //'open_eof_split' => true,
    //'package_eof' => "~",
    //'open_length_check'     => true,
    //'package_max_length'    => 8192000000000000000,
    //'package_length_type'   => 'N',
    //'package_length_offset' => 4,
    //'package_body_offset'   => 0
]);
$serv->on('connect',function($serv,$fd){
    //可以打印一下
    //var_dump($serv);
    //var_dump($fd);
    echo $fd.":建立连接\n";
    $serv->send($fd,"welcome!");
});
$serv->on('receive',function($serv,$fd,$from_id,$data){
    echo "接收到数据\n";
    //var_dump($fd);
    //echo $data;
    //$buffer = str_split(bin2hex($data),2);
    //var_dump($buffer);
    //我们通过tcp接收到的数据是ASCII码二进制字符串,这里转化成十六进制我们对接接口进行对应的处理转化信息处理
    $buffer = bin2hex($data);//二进制转化为十六进制
    
    echo $buffer;
    $get_str = str_replace(" ","",$buffer);
    
    
    

    //$result = pack("H*", $send_str);//将十六进制命令包组合成二进制包
    //$serv->send($fd, $result);

    //$str = pack("H*",$data);
    //var_dump($str);
    //var_dump(bin2hex($data));
    //$buffer = str_split(bin2hex($data),2);
    //var_dump($buffer);
    //echo "#{$serv->worker_id}>> received length=" . strlen($data) . "\n";
    //$serv->send($fd, $data);
    //$serv->send($fd,"aaa");
});
$serv->on('close',function($serv,$fd){
    echo "关闭连接\n";
});
//开启tcp服务器
$serv->start();
//将文件上传到搭建好的swoole服务器
//执行php tcp.php启动服务器
//查看tcp服务器是否正常运行命令:ps -ajft
//用网络调试工具测试是否正常
//注意关闭防火墙,确认tcp服务器开启成功

保存好文件就可以执行:php tcp.php启动服务器了

然后用工具模拟创建tcp客户端(测试好9502端口是否打开,或者关闭防火墙) 

可以模拟字符串的传输或者十六进制数据的传输。就可以进行对应的数据传输了。。。。。。

本次开发的疑惑点:

1、TCP传输的数据格式十六进制,接收到数据是ASCII码对应的二进制字符串

2、TCP服务器给客户端传输的数据也是要把十六进制打包(pack)成二进制ASCII码对应的字符串格式,参考pack()函数的用法

3、测试工具模拟发送十六进制的数据格式不要带空格例如:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值